在Swift3中,我之前使用以下方法将Bool转换为Int
let _ = Int(NSNumber(value: false))
转换为Swift4后,我得到了一个"' init'已被弃用"警告。怎么办呢?
答案 0 :(得分:21)
使用Swift 4.2,根据您的需要,您可以选择以下5种解决方案中的一种来解决您的问题。
NSNumber
的{{1}}属性intValue
import Foundation
let integer = NSNumber(value: false).intValue
print(integer) // prints 0
import Foundation
let integer = NSNumber(value: false) as? Int
print(String(describing: integer)) // prints Optional(0)
的{{3}}初始值设定项Int
作为上一代码的替代方法,您可以使用下面更简洁的代码。
import Foundation
let integer = Int(exactly: NSNumber(value: false))
print(String(describing: integer)) // prints Optional(0)
import Foundation
let integer = Int(exactly: false)
print(String(describing: integer)) // prints Optional(0)
的{{3}}初始值设定项Int
请注意,以下代码不需要导入Foundation。
用法#1(if语句):
import Foundation
let integer = Int(truncating: false)
print(integer) // prints 0
用法#2(三元运算符):
let integer: Int
let bool = false
if bool {
integer = 1
} else {
integer = 0
}
print(integer) // prints 0
答案 1 :(得分:4)
您可以使用NSNumber属性intValue:
let x = NSNumber(value: false).intValue
您还可以使用init?(exactly number: NSNumber)
初始化程序:
let y = Int(exactly: NSNumber(value: false))
或@Hamish的评论中提到,数字初始化程序已重命名为init(truncating:)
let z = Int(truncating: NSNumber(value: false))
或者让Xcode从@MartinR
中隐含地创建一个NSNumberlet z = Int(truncating: false)
你有另一个选择是扩展协议BinaryInteger(Swift 4)或Integer(Swift3)并创建你自己的非易错初始化程序,它将Bool作为参数并使用三元运算符返回原始类型,如@vadian的评论所示:
extension BinaryInteger {
init(_ bool: Bool) {
self = bool ? 1 : 0
}
}
let a = Int(true) // 1
let b = Int(false) // 0
let c = UInt8(true) // 1
let d = UInt8(false) // 0