将Int转换为Bool

Hen*_*Lee 28 int boolean swift swift3

在Swift 2.x中我相信我能做到:

let number = 1
let result = Bool(number)

print(result) // prints out: true
Run Code Online (Sandbox Code Playgroud)

但是自从Swift 3以来我一直无法做到这一点并且它给了我错误:

无法使用类型'(Int)'的参数列表调用类型'Bool'的初始化程序

目前我正在使用扩展转换Int为a,Bool但我想知道是否没有构建选项来执行此操作.

dfr*_*fri 49

不,有从来没有明确的内置选项转换IntBool,有关详细信息,请参阅语言参考Bool.

但是,仍有一个初始化器NSNumber.不同之处在于Swift数字类型之间的隐式桥接NSNumber已在Swift 3中删除(之前允许Bool通过Int初始化显示的内容).你仍然可以被访问此NSNumber初始化通过明确地执行转换IntNSNumber:

let number = 1
let result = Bool(number as NSNumber)

print(result) // true
Run Code Online (Sandbox Code Playgroud)

正如@Hamish在下面的评论中写道:如果我们离开初始化者的主题并只关注最终结果(实例化一个Bool给定实例值的Int实例),我们可以简单地使用!=运算符来表示Int值(特别是运算符签名func !=(lhs: Int, rhs: Int) -> Bool),使用!=运算符方法可轻松实现的泛化:

let number = -1
let result = number != 0

print(result) // true
Run Code Online (Sandbox Code Playgroud)

就像你自己和@JAL在他的回答中所描述的那样,你可以Bool通过Int初始化器来构建自己的,但你也可以考虑对符合Integer协议的任何类型进行概括:

extension Bool {
    init<T: Integer>(_ num: T) {
        self.init(num != 0)
    }
}

/* example usage */
let num1: Int8 = -1
let num2: Int = 3
let num3: UInt64 = 0
// ....
let result1 = Bool(num1) // true
let result2 = Bool(num2) // true
let result3 = Bool(num3) // false
Run Code Online (Sandbox Code Playgroud)

  • 或者没有obj-c桥,`let result = number!= 0` :) (7认同)
  • @Hamish哦亲爱的斯威夫特你在我的生活中去了哪里,这些评论讨论想让我回到它!:) (2认同)

lin*_*hen 20

斯威夫特4

extension Int {
    var boolValue: Bool { return self != 0 }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

extension Integer {
    var boolValue: Bool { return self != 0 }
}
Run Code Online (Sandbox Code Playgroud)

用法

let number = 2
print(number.boolValue)

let items = ["1"]
print(items.count.boolValue)
Run Code Online (Sandbox Code Playgroud)


JAL*_*JAL 6

没有布尔初始值设定项Int仅使用NSNumber.以前,它通过Foundation Int隐式桥接NSNumber,但在Swift 3中删除了.

你可以这样做:

let result = Bool(number as NSNumber)
Run Code Online (Sandbox Code Playgroud)

或者,您可以扩展Bool并创建一个带有Int的自定义init:

extension Bool {    
    init(_ number: Int) {
        self.init(number as NSNumber)
    }
}
Run Code Online (Sandbox Code Playgroud)


art*_*mal 6

我正在使用Xcode 9.0.1和Swift 3.0。

let result = (number as NSNumber).boolValue
Run Code Online (Sandbox Code Playgroud)

这对我来说很好。


pat*_*val 5

雨燕5

let number = 1
let result = Bool(truncating: number as NSNumber) //here result will be false if the number's value is 0 and it will be true for any other number's value

print(result)
Run Code Online (Sandbox Code Playgroud)