我正在从 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?
您可以使用三元运算符将 Bool 转换为 Int:
let result = condition ? 1 : 0
如果result
为真,
condition
将为1,如果condition
为假,则为0。
布尔 -> 整数
extension Bool {
var intValue: Int {
return self ? 1 : 0
}
}
整数 -> 布尔
extension Int {
var boolValue: Bool {
return self != 0
}
}
试试这个,
let p1 = ("a" == "a") //true
print(true) //"true\n"
print(p1) //"true\n"
Int(true) //1
Int(NSNumber(value:p1)) //1
编辑——从评论中的对话来看,下面的第二种方法(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)).")
这是一种更通用的方法,适用于其他类型,而不仅仅是 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
您可以使用 hashValue 属性:
let active = true
active.hashValue // returns 1
active = false
active.hashValue // returns 0
unsafeBitCast
总是一个选择
let int: Int = Int(unsafeBitCast(someBool, to: UInt8.self))
在 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))
swift 5:
你可以这样做:
let x = ("a" == "a")
Int(truncating: x as NSNumber)