在 Swift 2.x 中我相信我可以做到:
let number = 1
let result = Bool(number)
print(result) // prints out: true
但自 Swift 3 以来,我一直无法执行此操作,并且它给了我错误:
无法使用参数列表调用“Bool”类型的初始化程序 输入“(Int)”
目前我正在使用扩展将
Int
转换为 Bool
但我想知道是否没有内置选项可以执行此操作。
不,有且从未有过用于将
Int
转换为 Bool
的显式内置选项,请参阅 Bool
的语言参考了解详细信息。
然而,仍然存在 NSNumber
NSNumber
之间的隐式桥接已在 Swift 3 中删除(之前允许通过 Bool
初始化来实现看似显式的 Int
)。您仍然可以通过显式执行从 NSNumber
到 Int
的转换,通过 NSNumber
初始化程序来访问它:
let number = 1
let result = Bool(number as NSNumber)
print(result) // true
正如 @Hamish 在下面的评论中写道:如果我们离开初始化器的主题,只关注最终结果(给定
Bool
实例的值,实例化 Int
实例),我们可以简单地使用 !=
Int
值的运算符(具体来说,具有签名
func !=(lhs: Int, rhs: Int) -> Bool
的运算符),使用!=
运算符方法可以轻松实现泛化:
let number = -1
let result = number != 0
print(result) // true
就像您自己以及 @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
extension Int {
var boolValue: Bool { return self != 0 }
}
extension Integer {
var boolValue: Bool { return self != 0 }
}
let number = 2
print(number.boolValue)
let items = ["1"]
print(items.count.boolValue)
没有布尔初始值设定项需要
Int
,只有 NSNumber
。之前,Int
通过 Foundation 隐式桥接到 NSNumber
,但在 Swift 3 中已被删除。
你可以这样做:
let result = Bool(number as NSNumber)
或者,您可以扩展
Bool
并创建一个采用 Int 的自定义 init:
extension Bool {
init(_ number: Int) {
self.init(number as NSNumber)
}
}
我使用的是 Xcode 9.0.1 和 Swift 3.0。
let result = (number as NSNumber).boolValue
这对我来说非常有效。
斯威夫特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)
let iFalse: Int = 0
let iTrue: Int = 1
let iNil: Int = 2 //or any number other than 0 & 1
Bool(exactly: iFalse as NSNumber) //false
Bool(exactly: iTrue as NSNumber) //true
Bool(exactly: iNil as NSNumber) //nil
Swift 5试试这个
extension Int32 {
var boolValue: Bool {
return (self as NSNumber).boolValue
}
}
或
extension Int32 {
var boolValue: Bool {
return Bool.init(truncating: NSNumber.init(value: self))
}
}
类似这样的事情。检查条件是否成立并返回
let result = number == 1 ? true : false