Swift 将Int转换为Bool

Swift 将Int转换为Bool,swift,int,boolean,swift3,Swift,Int,Boolean,Swift3,在Swift 2.x中,我相信我可以做到: let number = 1 let result = Bool(number) print(result) // prints out: true 但自从Swift 3以来,我一直无法做到这一点,这给了我一个错误: 无法使用参数列表调用类型“Bool”的初始化器 类型“(Int)” 目前,我正在使用扩展将Int转换为Bool,但我想知道是否没有内置选项来执行此操作。没有接受Int的布尔初始值设定项,只有NSNumber。以前, int /COD>

在Swift 2.x中,我相信我可以做到:

let number = 1
let result = Bool(number)

print(result) // prints out: true
但自从Swift 3以来,我一直无法做到这一点,这给了我一个错误:

无法使用参数列表调用类型“Bool”的初始化器 类型“(Int)”


目前,我正在使用扩展将
Int
转换为
Bool
,但我想知道是否没有内置选项来执行此操作。

没有接受
Int
的布尔初始值设定项,只有
NSNumber
。以前,<代码> int /COD>通过基础隐式桥接到<代码> NStuts,但在Swift 3中被删除。

您可以执行以下操作:

let result = Bool(number as NSNumber)
或者,您可以扩展
Bool
并创建一个接受Int的自定义init:

extension Bool {    
    init(_ number: Int) {
        self.init(number as NSNumber)
    }
}

不,有而且从来没有明确的内置选项用于将
Int
转换为
Bool
,请参阅

然而,仍然存在一个问题。不同之处在于,Swift数值类型和
NSNumber
之间的隐式桥接已在Swift 3中删除(之前允许通过
Int
初始化显式
Bool
)。您仍然可以通过显式执行从
Int
NSNumber
的转换,通过
NSNumber
初始值设定项来访问此文件:

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

print(result) // true
正如@Hamish在下面的评论中写道的那样:如果我们离开初始化者的主题,只关注最终结果(实例化
Bool
实例,给定
Int
实例的值),我们可以简单地利用
=Int
值的code>运算符(特别是带有签名的
func!=(lhs:Int,rhs:Int)->Bool的运算符),使用
可以轻松实现一种泛化=操作员方法:

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

print(result) // true

<> P>和你自己一样,你可以通过<代码> int 初始化器构造你自己的<代码>布尔-< /代码>,但是你不妨考虑将它推广到符合

的任何类型。
扩展Bool{
初始值(num:T){
self.init(num!=0)
}
}
/*示例用法*/
设num1:Int8=-1
设num2:Int=3
设num3:UInt64=0
// ....
设result1=Bool(num1)//true
设result2=Bool(num2)//true
设result3=Bool(num3)//false
Swift 4 斯威夫特3 用法
我使用的是Xcode 9.0.1和Swift 3.0

let result = (number as NSNumber).boolValue

这对我来说非常有效。

Swift 5试试这个

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
extension Int32 {
    var boolValue: Bool {
        return (self as NSNumber).boolValue
    }
}


Swift 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)

或者没有obj-c桥,
let result=number!=0
:)@Hamish当我说
让我=1;让b=Bool(i作为NSNumber)
,为什么编译器现在告诉我使用
init(truncating:)
?@matt这是的一部分,通过使用
init(truncating:)
你承认转换可能是有损的,因为任何非零数字都映射到
true
(因此无法映射回原始数字)。这是由于引入了
init(精确:)
,如果数字不能精确表示,它将返回
nil
,对于
Bool
来说,这是任何不是0或1的数字。@Hamish谢谢,这正是我需要知道的@哈米什:哦,亲爱的斯威夫特,你在我的生活中到哪里去了,这些评论讨论想把我带回到它身边!:)有趣的是,这在Xcode 8.0上似乎不起作用,但在8.2/8.3上效果很好。@BonanzaDriver这有什么“不起作用”呢?它不编译吗?没有返回正确的布尔值?如何:
var boolValue:bool{return self!=0}
为Swift 4更新:
extension Int{var boolValue:bool{return self!=0}
我会使用
bool?
。在我看来,
-1.boolValue
以及
2.boolValue
应该返回
nil
@RyuX51
扩展名可选,其中Wrapped==Int{var boolValue:Bool{return self?.boolValue??false}
@lingchen我不是指可选的Int,但如果Int不是0或1,我更喜欢
nil
。像
扩展Int{var boolValue:Bool?{switch self{case 0:return true case 1:return false default:return nil}}}
甚至不完全清楚“将Int转换为Bool”是什么意思。历史上,像C这样的语言将非零视为
true
,将
0
视为
false
,但这只是内存中编码true与false的实现细节的结果。当你考虑它时,它实际上在语义上没有什么意义。因此,只需显式地使用
i!=0
,以明确您的确切含义。过度假设其可推广性并将其命名为
boolValue
是不明确的。首先,Bash/linux退出代码正好相反。0表示良好/正确,非零表示不良/错误。
let result = (number as NSNumber).boolValue
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
extension Int32 {
    var boolValue: Bool {
        return (self as NSNumber).boolValue
    }
}
extension Int32 {
    var boolValue: Bool {
        return Bool.init(truncating: NSNumber.init(value: self))
    }
}
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)