Я думаю, что сообщения об ошибках, которые вы отправили, говорят сами за себя, 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, поскольку существует реализация по умолчанию, но с опцией вы получите соответствующий ответ.