当前位置: 首页 > 面试题库 >

类型“布尔”不符合协议“布尔类型”

太叔正文
2023-03-14
问题内容

尝试按照Apple文档(和教程化的)创建Launch Helper时,我似乎遇到了麻烦,原因是将Objective-
C代码移植到Swift中…在此方面,谁的编译器再也不过分了案件。

import ServiceManagement

let launchDaemon: CFStringRef = "com.example.ApplicationLauncher"

if SMLoginItemSetEnabled(launchDaemon, true) // Error appears here
{
    // ...
}

该错误似乎始终是:

Type 'Boolean' does not conform to protocol 'BooleanType'

我尝试过Bool在多个位置进行转换,以防万一我只是在处理一个多余的,古老的原语(由Obj-
C或Core Foundation引入)而无济于事。

为了以防万一,我尝试投射响应:

SMLoginItemSetEnabled(launchDaemon, true) as Bool

产生错误:

'Boolean' is not convertible to 'Bool'

…严重吗?


问题答案:

Boolean 是“历史Mac类型”,并声明为

typealias Boolean = UInt8

所以这样编译

if SMLoginItemSetEnabled(launchDaemon, Boolean(1)) != 0 { ... }

使用以下Boolean类型的扩展方法(并且我不确定是否以前已经发布过此方法,现在无法找到它):

extension Boolean : BooleanLiteralConvertible {
    public init(booleanLiteral value: Bool) {
        self = value ? 1 : 0
    }
}
extension Boolean : BooleanType {
    public var boolValue : Bool {
        return self != 0
    }
}

你可以写

if SMLoginItemSetEnabled(launchDaemon, true) { ... }
  • BooleanLiteralConvertible扩展名允许第二个参数自动转换trueBoolean
  • BooleanType扩展允许将Boolean 函数的返回值自动转换Bool为if语句。

更新:Swift 2 / Xcode 7 beta 5开始, “ historic Mac type” Boolean
被映射为Swift Bool,使得上述扩展方法已过时。



 类似资料:
  • Dart为布尔数据类型提供内置支持,Dart中的布尔数据类型仅支持两个值 - 和。关键字用于表示Dart中的布尔文字。 在Dart中声明布尔变量的语法,如下所示 - 示例1 执行上面示例代码,得到以下结果 - 示例2 与JavaScript不同,布尔数据类型仅将文字识别为。任何其他值都被视为。考虑以下示例 - 如果在JavaScript中运行,上面的代码段将打印消息 - ,因为如果字符串不为空,结

  • Python 提供了 bool 类型来表示真(对)或假(错),比如常见的 比较算式,这个是正确的,在程序世界里称之为真(对),Python 使用 True 来代表;再比如 比较算式,这个是错误的,在程序世界里称之为假(错),Python 使用 False 来代表。 True 和 False 是 Python 中的关键字,当作为 Python 代码输入时,一定要注意字母的大小写,否则解释器会报错。

  • 在C语言中,关系运算和逻辑运算的结果有两种,真和假:0 表示假,非 0 表示真。例如: 运行结果: 10 20↙ flag = 0 C语言并没有彻底从语法上支持“真”和“假”,只是用 0 和非 0 来代表。这点在 C++ 中得到了改善,C++ 新增了 bool 类型(布尔类型),它一般占用 1 个字节长度。bool 类型只有两个取值,true 和 false:true 表示“真”,false 表示

  • 2.4 布尔类型 bool 布尔是 19 世纪英国数学家,他建立了命题代数,简单说就是将逻辑推理变成了代数计 算。所谓命题就是可以判断真假的语句,因此在编程语言中,将真、假两个值构成了一个类 型,即布尔类型,真和假也称为布尔值。以真或假为值的表达式称为布尔表达式,它在程序 设计中的作用是描述某种条件,以支持“如果某条件满足,则执行某语句”之类的处理过程。 第 3 章将学习的条件和循环语句中都会用到

  • 一个布尔类型的值只有两种:true 或 false。if 和 for 语句的条件部分都是布尔类型的值,并且 和 等比较操作也会产生布尔型的值。 一元操作符 对应逻辑非操作,因此 的值为 false,更复杂一些的写法是 ,实际开发中我们应尽量采用比较简洁的布尔表达式,就像用 x 来表示 。 Go语言对于值之间的比较有非常严格的限制,只有两个相同类型的值才可以进行比较,如果值的类型是接口(interf

  • 3.4. 布尔型 一个布尔类型的值只有两种:true和false。if和for语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔型的值。一元操作符!对应逻辑非操作,因此!true的值为false,更罗嗦的说法是(!true==false)==true,虽然表达方式不一样,不过我们一般会采用简洁的布尔表达式,就像用x来表示x==true。 布尔值可以和&&(AND)和||(OR)操作