в Objective-C:
@interface CustomDataSource : NSObject <UITableViewDataSource>
@end
в Swift:
class CustomDataSource : UITableViewDataSource {
}
Однако появится сообщение об ошибке:
Каким должен быть правильный путь?
Тип "CellDatasDataSource" не соответствует протоколу "NSObjectProtocol"
Вы должны наследовать свой класс от NSObject
, чтобы соответствовать NSObjectProtocol
. Классы Vanilla Swift - нет. Но многие части UIKit
ожидают NSObject
s.
class CustomDataSource : NSObject, UITableViewDataSource {
}
Но это:
ОжидаетсяТип 'CellDatasDataSource' не соответствует протоколу 'UITableViewDataSource'
. Вы получите сообщение об ошибке, пока ваш класс не выполнит все необходимые методы протокола.
Итак, получите кодировку:)
Xcode 9, помогает реализовать все обязательные методы Swift Datasource и Delegates.
Вот пример UITableViewDataSource
:
Показывает предупреждение/подсказку для реализации обязательных методов:
Нажмите кнопку "Fix", он добавит все обязательные методы в код:
Класс должен наследовать от родительского класса до соответствия протоколу. В основном это два способа сделать это.
Один из способов - наследовать свой класс от NSObject
и соответствовать UITableViewDataSource
вместе. Теперь, если вы хотите изменить функции в протоколе, вам нужно добавить ключевое слово override
перед вызовом функции, например
class CustomDataSource : NSObject, UITableViewDataSource {
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
// Configure the cell...
return cell
}
}
Однако иногда этот код становится бесполезным, потому что у вас может быть много протоколов, и каждый протокол может иметь несколько функций делегата. В этой ситуации вы можете отделить протокол, соответствующий коду, от основного класса, используя extension
, и вам не нужно добавлять ключевое слово override
в расширение. Таким образом, эквивалент кода выше будет
class CustomDataSource : NSObject{
// Configure the object...
}
extension CustomDataSource: UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
// Configure the cell...
return cell
}
}