Различное поведение между T.Type и [T.Type] - PullRequest
0 голосов
/ 13 сентября 2018

Я использую обобщенную функцию для улучшения ячеек таблицы, как показано ниже;

public func registerNib<T: UITableViewCell>(_:T.Type) {
    print("Registering.....")
    print(T.self)
    let nib = UINib(nibName: String(describing: T.self), bundle: nil)
    register(nib, forCellReuseIdentifier: String(describing: T.self))
}

И я написал две функции для регистрации ячейки, одну для одной ячейки и одну для нескольких ячеек.

// Регистр с одной ячейкой

func setup<T: UITableViewCell>(cell:T.Type) {
   print(cell)
   tableView.registerNib(cell)
   self.setupParameters(.....)
}

// Регистр с несколькими ячейками

func setup<T: UITableViewCell>(cells:[T.Type]) {
   for cell in cells {
        print(cell)
        tableView.registerNib(cell)
    }
   self.setupParameters(.....)
}

Для реализации с одной ячейкой вы можете вызвать func, как показано нижеи он будет правильно регистрировать Nib.

self.baseTableView.setup(cell: CompetencyCell.self, rowHeight: 60)

**************
Output:
CompetencyCell
Registering...
CompetencyCell

Но проблема заключается в множественной реализации;

self.baseTableView.setup(cells: [CompetencyCell.self, BehaviorCell.self], rowHeight: 60)

**************
Output:
CompetencyCell
BehaviorCell
Registering...
UITableViewCell
UITableViewCell

Мне действительно интересно, в чем причина, или что я пропускаю?Это похоже на то же поведение, но когда я хочу передать значение T.Type методу RegisterNib, оно превращается в UITableViewCell, и после некоторого момента, конечно, у меня происходит сбой, поскольку он не может найти ячейку.

У вас есть какой-либо совет?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Как описано в ответе Вадиана, generic не является хорошим инструментом для использования с массивом, содержащим несколько типов значений.

Вы можете попробовать что-то вроде этого:

extension UITableView {
    public func registerNib(_ type: UITableViewCell.Type) {
        print("Registering.....")
        print(type)
        let nib = UINib(nibName: String(describing: type), bundle: nil)
        register(nib, forCellReuseIdentifier: String(describing: type))
    }
}

И это:

func setup(cells: [UITableViewCell.Type] /*, otherParams: ...*/) {
    for cell in cells {
        print(cell)
        tableView.registerNib(cell)
    }
    //self.setupParameters(.....)
}
0 голосов
/ 13 сентября 2018

При вызове универсальной функции универсальный тип T представляет одиночный статический тип.

[T.Type] не имеет смысла, поскольку объявляет массив из того же спецификатор типа.

T не означает Any!

...