Как сделать класс совместимым с протоколом в Swift?

в Objective-C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

в Swift:

class CustomDataSource : UITableViewDataSource {

}

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

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

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

Ответ 1

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

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

class CustomDataSource : NSObject, UITableViewDataSource {

}

Но это:

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

Ожидается

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

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

Ответ 2

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

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

Ответ 3

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

Вот пример UITableViewDataSource:

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

введите описание изображения здесь

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

введите описание изображения здесь