如何在Objective-C中表示可选的Bool(Bool?)?

Md.*_*san 4 swift

我想在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)

有什么建议吗?

mat*_*att 9

问题是这种类型声明:

`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 truefalse).

所以你有三个选择:

  • 拿走@objc那些将所有这些暴露给Objective-C

  • 删除Optional,只需声明键入Bool

  • 使用对象类型.例如,将类型声明为AnyObject?(或NSNumber?).这将起作用,因为Swift将Bool桥接到NSNumber(包括它传递给AnyObject),而Objective-C将使用Optional AnyObject或Optional NSNumber处理得很好,因为它们是对象类型,而不是标量.

  • @ Md.NajmulHasan并非所有人都对Stack Overflow所说的一切都是正确的。:) (3认同)