Как заставить класс соответствовать протоколу в Swift?

110

в Objective-C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

в Swift:

class CustomDataSource : UITableViewDataSource {

}

Однако появится сообщение об ошибке:

  • Тип 'CellDatasDataSource' не соответствует протоколу 'NSObjectProtocol'
  • Тип 'CellDatasDataSource' не соответствует протоколу 'UITableViewDataSource'

Каким должен быть правильный путь?

  • 1
    Имя класса в ваших сообщениях об ошибках не совпадает с указанным вами кодом?
  • 2
    Классы Swift по умолчанию не наследуются от NSObject. Они являются их собственными базовыми классами, если не указано иное.
Теги:

3 ответа

240
Лучший ответ

Тип "CellDatasDataSource" не соответствует протоколу "NSObjectProtocol"

Вы должны наследовать свой класс от NSObject, чтобы соответствовать NSObjectProtocol. Классы Vanilla Swift - нет. Но многие части UIKit ожидают NSObject s.

class CustomDataSource : NSObject, UITableViewDataSource {

}

Но это:

Тип 'CellDatasDataSource' не соответствует протоколу 'UITableViewDataSource'

Ожидается

. Вы получите сообщение об ошибке, пока ваш класс не выполнит все необходимые методы протокола.

Итак, получите кодировку:)

  • 0
    Спасибо @Alex; Вы спасли мой день, поскольку я довольно долго пытался привести свой класс Swift в соответствие с протоколом UICollectionViewDataSource. Добавление наследования NSObject в моем классе решило это!
  • 1
    Я единственный, кто считает, что предупреждения о компиляции было достаточно?
Показать ещё 2 комментария
0

Xcode 9, помогает реализовать все обязательные методы Swift Datasource и Delegates.

Вот пример UITableViewDataSource:

Показывает предупреждение/подсказку для реализации обязательных методов:

Изображение 1922

Нажмите кнопку "Fix", он добавит все обязательные методы в код:

Изображение 1923

0

Класс должен наследовать от родительского класса до соответствия протоколу. В основном это два способа сделать это.

Один из способов - наследовать свой класс от 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
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню