Swift3 在swift 3中将布尔值转换为整数值

Swift3 在swift 3中将布尔值转换为整数值,swift3,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)会产

我正在从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)
会产生一个错误

错误是
错误:无法使用类型为“((Bool))”的参数列表调用类型为“Int”的初始值设定项。


我理解错误发生的原因。谁能解释一下这种安全性的原因是什么,以及如何在swift 3中从Bool转换为Int?

您可以使用三元运算符将Bool转换为Int:

let result = condition ? 1 : 0

如果
条件
为真,则
结果
将为1;如果
条件
为假,则0为
结果。

编辑-从评论中的对话中可以看出,下面的第二种方法(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)).")
试试这个

let p1 = ("a" == "a") //true
print(true)           //"true\n"
print(p1)             //"true\n"

Int(true)             //1

Int(NSNumber(value:p1)) //1

您可以使用hashValue属性:

let active = true
active.hashValue // returns 1
active = false
active.hashValue // returns 0
斯威夫特5 布尔->整数

Int->Bool


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

让boolAsInt=?1:0

好的,所以在swift 3中从布尔值转换为整数值是不允许的?@S_kar是的,它已被删除。我不知道官方原因——但Swift团队已经声明他们将尝试从标准库中删除任何“隐式/不清晰”类型转换,我猜Bool到Int的转换属于这一类。我不相信这一转换是Swift真正的一部分。我相信这是通过NSNumber进行隐式转换的副作用。隐式Bool/Int转换是C语言中的一个老问题(特别是,因为像“2”这样的非零数字是“true ish”,但不等于
true
)。斯威夫特已经积极地试图避免这些历史性的bug来源。@RobNapier哦,这实际上更有意义-感谢这些精确性。或者将@eric aya的三元op建议与协议结合起来,以达到最大的简洁性!Swift核心团队通常不鼓励这种方法。他们建议使用
Int.init
重载而不是执行全宽转换的方法。我能读到任何关于@Rob napier的文档吗?我想更多地了解为什么会让人泄气,以及导致这一决定的讨论;埋在斯威夫特埃沃的某处。但是你可以通过观察stdlib是如何演变的来看到这个观点的结果。例如,请参见并注意,
…value
方法已转换为
init
(stdlib中从来没有很多
…value
方法,但请参见
ObjectIdentifier
StaticString
)。另外请注意,在Swift 3样式指南中,类型转换仅根据init进行讨论。从来没有方法。酷,比什么都好奇。谢谢有关Swift 4,请参阅我的,以了解类似的问题。快告诉我!这绝对是我首选的解决方案。在这里,它比其他解决方案更符合Swift惯例,而相反的方向(Int->Bool)从来没有想过用这种方式解决它。这很好。类似于NSNumber。如果您在Swift 4.2中这样做,您将获得类似482808648934333090的值和类似值。是的,您可以看看这个Q&A似乎不推荐使用
extension Int {
    var boolValue: Bool {
        return self != 0 
    }
}
let p1 = ("a" == "a") //true

print(true)           //"true\n"
print(p1)             //"true\n"

Int(true)             //1

print(NSNumber(value: p1))