&引用';初始';“已弃用”;Swift4转换后的警告

&引用';初始';“已弃用”;Swift4转换后的警告,swift,swift4,Swift,Swift4,在Swift3中,我以前使用以下方法将布尔值转换为Int let _ = Int(NSNumber(value: false)) 转换成Swift4后,我得到一个“'init'已弃用”警告。还应如何执行此操作?您可以使用NSNumber属性intValue: let x = NSNumber(value: false).intValue 您还可以使用init?(精确编号:NSNumber)初始值设定项: let y = Int(exactly: NSNumber(value: false))

在Swift3中,我以前使用以下方法将布尔值转换为Int

let _ = Int(NSNumber(value: false))

转换成Swift4后,我得到一个“'init'已弃用”警告。还应如何执行此操作?

您可以使用NSNumber属性intValue:

let x = NSNumber(value: false).intValue
您还可以使用
init?(精确编号:NSNumber)
初始值设定项:

let y = Int(exactly: NSNumber(value: false))
或者如@Hamish的评论中所述,数值初始值设定项已重命名为
init(截断:)

或者让Xcode隐式地从中创建一个NSNumber,如@MartinR所述

let z = Int(truncating: false)
另一个选项是扩展协议二进制Integer(Swift 4)或Integer(Swift3),并创建自己的不易出错的初始值设定项,该初始值设定项以Bool为参数,并使用@vadian注释中建议的三元运算符返回原始类型:

extension BinaryInteger {
    init(_ bool: Bool) {
        self = bool ? 1 : 0
    }
}


使用Swift 4.2和Swift 5,您可以选择以下5种解决方案之一来解决您的问题


#1.使用
NSNumber
intValue
属性
#2.采用型铸造
#3.使用
Int
的初始值设定项 作为前面代码的替代,您可以使用下面更简洁的代码

import Foundation

let integer = Int(exactly: false)
print(String(describing: integer)) // prints Optional(0)

#4.使用
Int
的初始值设定项
#5.使用控制流

注意以下样本代码不需要导入基金会。

用法#1(如果声明):

用法#2(三元运算符):


这是非常不现实的代码。为什么不
let=false?1:0
你说得对,这更有意义,我会用它。谢谢@瓦迪亚人-我是n00b。我不明白,如果要给三元运算符输入“false”,为什么还要麻烦它呢。为什么不干脆
let=0
?@JamesTSnell这只是一个如何从
Bool
创建
Int
的示例。实际上,
false
应该是一个变量。谢谢vadian。现在这似乎很明显。也许我喝得太多了^_^太好了,它起作用了!有没有理由不推荐前面的方法?在Swift 4中,甚至
让x=Int(确切地说:false)
works根据–so
Int(截断:NSNumber(值:false))
将要从
NSNumber
转换为Swift数字类型的
init(u:)
初始化器重命名为
init(截断:)
。但是在这种情况下,
.intValue
应该达到相同的结果(当然,正如瓦迪安指出的,首先不需要通过
NSNumber
。@vadian:
让x=Int(精确:false)
从布尔值隐式创建一个
NSNumber
。。。。而且不会在不导入基础的情况下编译。
let a = Int(true)   // 1
let b = Int(false)  // 0

let c = UInt8(true)  // 1
let d = UInt8(false) // 0
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)
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)
import Foundation

let integer = Int(truncating: false)
print(integer) // prints 0
let integer: Int
let bool = false

if bool {
    integer = 1
} else {
    integer = 0
}
print(integer) // prints 0
let integer = false ? 1 : 0
print(integer) // prints 0