在swift 3中将布尔值转换为Integer值

时间:2016-10-25 14:29:53

标签: swift3

我正在从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?

8 个答案:

答案 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)

Swift 4

  

布尔 - > 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)

斯威夫特 5.4

这是一种更通用的方法,适用于其他类型,而不仅仅是 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