具有结构类型的可选委托 - swift

optional delegates with struct types - swift

我在将协议设置为可选项时出现以下错误。

Method cannot be marked @objc because the type of the parameter 1 cannot be represented in 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
    }
}

Only classes (and their extensions), protocols, methods, initializers, properties, and subscript declarations can be declared @objc


有什么方法可以用结构类型实现可选委托吗?

我认为您发布的错误消息是不言自明的,StructObjective-C 运行时不可用,因此当您使用 @objc 注释协议时,编译器会警告您结构可以' 不能作为参数传递给此类协议。

如何在纯 swift 中实现可选行为? swift 中没有正式的 objective-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,这将 return 为真,因为存在默认实现,但如果使用可选实现,您将得到适当的响应。