我正在从swift 2转换为swift 3.我注意到我无法在swift 3中将布尔值转换为整数值:\。
let p1 = ("a" == "a") //true
print(true) //"true\n"
print(p1) //"true\n"
Int(true) //1
Int(p1) //error
例如,这些语法在swift 2中运行良好。但在swift 3中,print(p1)
会产生错误。
错误为error: cannot invoke initializer for type 'Int' with an argument list of type '((Bool))'
我理解错误发生的原因。任何人都可以解释这种安全性的原因以及如何在swift 3中将Bool转换为Int?
答案 0 :(得分:42)
您可以使用三元运算符将Bool转换为Int:
let result = condition ? 1 : 0
如果result
为真,则 condition
为1,condition
为0。
答案 1 :(得分:21)
试试这个,
let p1 = ("a" == "a") //true
print(true) //"true\n"
print(p1) //"true\n"
Int(true) //1
Int(NSNumber(value:p1)) //1
答案 2 :(得分:14)
布尔 - > Int
extension Bool {
var intValue: Int {
return self ? 1 : 0
}
}
Int - >布尔
extension Int {
var boolValue: Bool {
return self != 0
}
}
答案 3 :(得分:11)
编辑 - 从评论中的对话中,越来越清楚的是,下面这样做的第二种方式(Int.init重载)更符合Swift前进的风格。
或者,如果你在应用程序中做了很多事情,你可以创建一个协议并扩展你需要转换为Int
的每种类型。
extension Bool: IntValue {
func intValue() -> Int {
if self {
return 1
}
return 0
}
}
protocol IntValue {
func intValue() -> Int
}
print("\(true.intValue())") //prints "1"
编辑 - 为了举例说明Rob Napier在下面的评论中提到的案例,可以这样做:
extension Int {
init(_ bool:Bool) {
self = bool ? 1 : 0
}
}
let myBool = true
print("Integer value of \(myBool) is \(Int(myBool)).")
答案 4 :(得分:4)
您可以使用 hashValue 属性:
let active = true
active.hashValue // returns 1
active = false
active.hashValue // returns 0
答案 5 :(得分:0)
在Swift 3.2和Swift 4中进行了测试
无需将其转换为 Int
尝试一下-
let p1 = ("a" == "a") //true
print(true) //"true\n"
print(p1) //"true\n"
Int(true) //1
print(NSNumber(value: p1))
答案 6 :(得分:0)
let boolAsInt = <#您的bool#>吗? 1:0
答案 7 :(得分:0)
这是一种更通用的方法,适用于其他类型,而不仅仅是 Int。
extension ExpressibleByIntegerLiteral {
init(_ booleanLiteral: BooleanLiteralType) {
self = booleanLiteral ? 1 : 0
}
}
let bool1 = true
let bool2 = false
let myInt = Int(bool1) // 1
let myFloat = Float(bool1) // 1
let myDouble = Double(bool2) // 0
let myCGFloat = CGFloat(bool2) // 0