BOOL 与 Swift 4.1 中的 Bool 不兼容

Posted

技术标签:

【中文标题】BOOL 与 Swift 4.1 中的 Bool 不兼容【英文标题】:BOOL is incompatible with Bool in Swift 4.1 【发布时间】:2018-03-30 07:12:25 【问题描述】:

在 Objective-C 类的 Swift 子类中重写时,我收到一条消息:

属性类型'BOOL'(又名'bool')与继承自'ChildClass'的类型'Boolean'(又名'unsigned char')不兼容

我尝试使用其他布尔类型,但它不起作用。

知道如何在 Swift 中正确覆盖 Objc BOOL

Swift 代码(子类):

override var myVar: Bool 
    get 
        return something ? true : myVar
    
    set 
        myVar = newValue
    

Objc 父声明:

@property(atomic) Boolean isLoading;

出现警告的 Swift 桥接头:

SWIFT_CLASS("_TtC6Module30ChildClass")
@interface ChildClass : ParentClass
@property (nonatomic) BOOL myVar; //<----- Here 
@end

【问题讨论】:

作为?布尔 - 也不起作用? @SergeyHleb 抱歉,我不太清楚。我添加了代码来消除歧义。问题在于桥接头的声明 您实际上是否在使用/覆盖isLoading 变量? 也许this可以帮助你? 【参考方案1】:

在 ObjC 中,BOOL 和 bool 不一样(BOOL 是有符号字符,而 bool - 也就是 C bool- 是无符号字符)。 Boolean 也是 unsigned char 的 typedef,C bool 也是如此。 您可以将 objC 属性更改为 BOOL 吗? 如果没有,则使用 swift 类型 'CBool​​'。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html

【讨论】:

如果我更改 Swift 类型,那么它会抱怨与 bool 不兼容。实际上,在 Objc 父级中使用 BOOL 就可以了。我已经习惯了在 objc 中只使用 BOOL 我什至没有注意到父母有不同的类型

以上是关于BOOL 与 Swift 4.1 中的 Bool 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

带有多个 sortDescriptor 和 Bool 过滤器的 Swift fetchRequest

在 Swift 中,Objective-C BOOL 被推断为 `()` 而不是 Bool

Swift 3 转换获取 'Int1' 不能转换为 'Bool'

在 swift assert(0) 中无法将 Int 类型的值转换为预期的参数类型 Bool

Swift bool 自行更改

如何检查String是否是Swift中的Int?