Общий параметр 'T' не может быть выведен Xcode 11 iOS 13 - PullRequest
2 голосов
/ 23 сентября 2019

Я получаю «Общий параметр« T »не может быть выведен» для следующего кода после обновления до Xcode 11. Ранее он использовался для нормальной работы.

extension UICollectionView {
    func register<T>(_ anyClass : T.Type) where T:UICollectionViewCell {
        register(anyClass.self, forCellWithReuseIdentifier: String.stringFromClass(anyClass))
    }

    func registerCells<T>(_ cells: [T.Type]) where T:UICollectionViewCell{
        for cellClass in cells{
            self.register(cellClass)
        }
    }
}

Получение ошибки при регистрации ячеек -

collectionView.registerCells([CarouselSmallVideoCell.self, CarouselSmallArticleCell.self])

Ответы [ 3 ]

3 голосов
/ 23 сентября 2019

Вам не нужно, чтобы register или registerCells были общими:

func register(_ anyClass : UICollectionViewCell.Type) {
    print("\(anyClass.self)")
}

func registerCells(_ cells: [UICollectionViewCell.Type]) {
    for cellClass in cells{
        register(cellClass)
    }
}
2 голосов
/ 23 сентября 2019

T должен быть получен из единственного типа.Я думаю, что Apple ввела в действие свои механизмы проверки типов компилятора в XCode 11.

Объяснение:

Для компилятора неоднозначно уверенно выводить тип, указанный здесь:

collectionView.registerCells([CarouselSmallVideoCell.self, CarouselSmallArticleCell.self])

Компилятор должен проверить, имеет ли T тип CarouselSmallVideoCell или CarouselSmallArticleCell;они не одного типа.

Вместо этого вы можете изменить сигнатуру своей функции с:

func registerCells<T>(_ cells: [T.Type]) where T:UICollectionViewCell

На:

func registerCells(_ cells: [UICollectionViewCell.Type])

0 голосов
/ 23 сентября 2019

Вывод типа, видимо, стал тупее.Сначала поместите массив в переменную:

let cells = [CarouselSmallVideoCell.self, CarouselSmallArticleCell.self]
collectionView.registerCells(cells)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...