如何在接受自定义类型参数的swift协议中定义可选方法?
我理解在swift协议中定义可选方法的方法是使用@objc
标志。像这样:
@objc protocol someSweetProtocol {
optional func doSomethingCool()
}
但是当我想将自定义类型用于参数时,如下所示:
@objc protocol someSweetProtocol {
optional func doSomethingCool(: HSCoolPerson)
}
我收到了这个错误:
哪个不酷。
如何解决这个问题?你也可以解释为什么会这样吗?
这是HSCoolPerson
的定义方式:
class HSCoolPerson {
...
...
...
}
那里没什么特别的......
答案 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)