如何使用Swift参数在Swift协议中定义可选方法?

时间:2016-03-24 00:52:34

标签: ios swift protocols

TL; DR

如何在接受自定义类型参数的swift协议中定义可选方法?

案例

我理解在swift协议中定义可选方法的方法是使用@objc标志。像这样:

@objc protocol someSweetProtocol {
    optional func doSomethingCool()
}

但是当我想将自定义类型用于参数时,如下所示:

@objc protocol someSweetProtocol {
    optional func doSomethingCool(: HSCoolPerson)
}

我收到了这个错误:

enter image description here

哪个不酷。

如何解决这个问题?你也可以解释为什么会这样吗?

附录

这是HSCoolPerson的定义方式:

class HSCoolPerson {
    ...
    ...
    ...
}

那里没什么特别的......

3 个答案:

答案 0 :(得分:4)

问题在于:

class HSCoolPerson {
    // ...
}

正如错误消息明确告诉您的那样,该类型HSCoolPerson类对Objective-C完全不可见。协议可选方法是Objective-C语言特性;斯威夫特只是借用它,就像它一样。 (这就是为什么你必须说@objc protocol才能获得这个功能。)所以每当你想要定义一个协议可选方法时,你必须以Objective-C可以理解的方式来做,因为它是Objective- C将为你做的工作。

要将此类公开给Objective-C,只需从NSObject派生它:

class HSCoolPerson : NSObject {
    // ...
}

问题解决了。

答案 1 :(得分:1)

将默认实现放在扩展名中,如下所示:

class HSCoolPerson {}

protocol SomeSweetProtocol {
    func doSomethingCool()
}

extension SomeSweetProtocol {
    func doSomethingCool(: HSCoolPerson) {
        // default implementation here
    }
}

class SomeSweetClass: SomeSweetProtocol {
    // no implementation of doSomethingCool(_:) here, and no errors
}

答案 2 :(得分:0)

您可以在协议中声明func

@objc optional func doSomethingCool(: HSCoolPerson)