Swift3 在swift 3中将布尔值转换为整数值
我正在从swift 2转换为swift 3。我注意到我不能在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)会产
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))