我想在swift中编写一个协议
@objc protocol RestAPIManagerDelegate {
optional func credentialValidated(isValid: Bool?)
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
'Method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C'
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
问题是这种类型声明:
`isValid: Bool?`
Run Code Online (Sandbox Code Playgroud)
这在Swift中完全没问题.但是你不能将它暴露给Objective-C,因为Objective-C没有任何关于Optional BOOL的概念 - Objective-C中的BOOL基本上只是一个数字,一个原始的C数据类型(我们称之为标量).
这是另一种看待它的方式.在与Objective-C的交换中,您可以在Objective-C可以说的任何地方使用Swift Optional nil- 事实上,在很大程度上,Swift Optional完全存在,以便处理Objective-C 可能会说nil或您可能需要的可能性对nilObjective-C 说.但Objective-C中的BOOL永远不会nil- 它只能是YES或NO(Swift true或false).
所以你有三个选择:
拿走@objc那些将所有这些暴露给Objective-C
删除Optional,只需声明键入Bool
使用对象类型.例如,将类型声明为AnyObject?(或NSNumber?).这将起作用,因为Swift将Bool桥接到NSNumber(包括它传递给AnyObject),而Objective-C将使用Optional AnyObject或Optional NSNumber处理得很好,因为它们是对象类型,而不是标量.
| 归档时间: |
|
| 查看次数: |
4835 次 |
| 最近记录: |