Подтвердить что ты не робот

Тип "myViewController" не соответствует протоколу UIPIckerDataSource в Swift

Я просто создаю новый класс в Swift, он называется myViewController, а он UIViewController. Теперь я пытаюсь сделать это UIPickerViewDelegate и DataSource, но у меня странная ошибка

import UIKit

class myViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
   ...
}

Он говорит Type "myViewController" does not conform to protocol UIPIckerDataSource над UIPickerViewDataSource.

Является ли это ошибкой Xcode-Beta 3??

Снимок экрана для ошибки времени компиляции

4b9b3361

Ответ 1

Вам необходимо реализовать все необходимые методы UIPickerViewDataSource и UIPickerViewDelegate, если вы хотите соответствовать этим протоколам.

Swift больше похожа на java, когда дело доходит до протоколов, потому что если вы не реализуете все необходимые методы, объявленные протоколом, вы получите ошибку времени компиляции вместо исключения времени выполнения.

Ответ 2

Исправление в XCode 8.1 вставляет устаревшую версию метода ниже, если вы используете Swift 3:

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return componentNumber
}

В XCode 10.0+

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return componentNumber
}

Ответ 3

Внедрите требуемый метод UIPickerDataSource, как в документации.

Источник данных предоставляет представление выбора с количеством компоненты и количество строк в каждом компоненте, для отображения данные представления сборщика. Оба метода в этом протоколе необходимы.

Итак, вам нужно реализовать эти методы

func numberOfComponentsInPickerView(_ pickerView: UIPickerView!) -> Int {}

   func pickerView(_ pickerView: UIPickerView!,
numberOfRowsInComponent component: Int) -> Int{}

Ответ 4

Моя проблема заключалась в том, что перед функцией реализации я имел override, где Swift не рассматривает переопределения методов протокола (тот же). Просто извлечение ключевого слова override устраняет проблему.

Ответ 5

Моя проблема - имя метода протокола является незаконным,

@protocol ContactsSelectDelegate <NSObject>

- (void)selectContacts:(NSMutableArray *)contacts Tags:(NSMutableArray *)tags;

@end

Здесь Tags: должно быть Tags:.
Надеюсь, мой ответ будет полезен.