опциональные делегаты с типами структуры - swift - PullRequest
0 голосов
/ 16 марта 2020

Я получаю ошибку ниже при создании протокола как опционального.

Метод не может быть помечен @ obj c, поскольку тип параметра 1 не может быть представлен в Objective- C

Мой код:

@objc protocol PopupDelegate : class {
    @objc optional func popupItemSelected(item : PopupItem, identifier : String)
    @objc optional func popupItemMultipleSelected(item : [PopupItem], identifier : String)
}

struct PopupItem : Hashable {
    var name : String
    var id : Int
    var isSelected : Bool

    init(name: String, id: Int, isSelected : Bool = false) {
        self.name = name
        self.id = id
        self.isSelected = isSelected
    }
}
  • Я получил один пост с той же проблемой в swift 2 , но я не могу реализовать это решение как Наследование не разрешено в struct .

  • Я попытался добавить флаг @ obj c в мою структуру но получили ошибку ниже

Только классы (и их расширения), протоколы, методы, инициализаторы, свойства и объявления нижнего индекса могут быть объявлены @ obj c


Есть ли способ реализовать необязательные делегаты с типами структуры?

1 Ответ

1 голос
/ 16 марта 2020

Я думаю, что сообщения об ошибках, которые вы отправили, говорят сами за себя, Struct недоступен во время выполнения Objective-C, поэтому, когда вы аннотируете протокол с помощью компилятора @objc, вы получаете предупреждение, что struct не может быть передана в качестве аргумента такой протокол.

Как добиться необязательного поведения в чистом swift? Официально в swift нет эквивалента цели - C optional. Но пустые расширения по умолчанию помогут вам достичь того же поведения.

protocol PopupDelegate {
    func popupItemSelected(item : PopupItem, identifier : String)
    func popupItemMultipleSelected(item : [PopupItem], identifier : String)
}

extension PopupDelegate {
    func popupItemSelected(item : PopupItem, identifier : String) { }
    func popupItemMultipleSelected(item : [PopupItem], identifier : String) { }
}

Теперь любому, кто подтверждает PopupDelegate, не нужно реализовывать методы, поскольку реализация по умолчанию уже предусмотрена, и потому что ее пустая реализация почти такая же, как и необязательная.

Одно предостережение этого подхода: если вы вызовете respondsToSelector, это вернет true, поскольку существует реализация по умолчанию, но с опцией вы получите соответствующий ответ.

...