Swift4转换后,"'init'已被弃用"警告

D. *_*hen 15 swift swift4

在Swift3中,我之前使用以下方法将Bool转换为Int

let _ = Int(NSNumber(value: false))
Run Code Online (Sandbox Code Playgroud)

转换为Swift4后,我得到了一个"'init'被弃用"警告.怎么办呢?

Ima*_*tit 21

使用Swift 4.2,根据您的需要,您可以选择以下5种解决方案中的一种来解决您的问题.


#1.使用NSNumberintValue财产

import Foundation

let integer = NSNumber(value: false).intValue
print(integer) // prints 0
Run Code Online (Sandbox Code Playgroud)

#2.使用类型铸造

import Foundation

let integer = NSNumber(value: false) as? Int
print(String(describing: integer)) // prints Optional(0)
Run Code Online (Sandbox Code Playgroud)

#3.使用Intinit(exactly:)初始化程序

import Foundation

let integer = Int(exactly: NSNumber(value: false))
print(String(describing: integer)) // prints Optional(0)
Run Code Online (Sandbox Code Playgroud)

作为上一代码的替代方法,您可以使用下面更简洁的代码.

import Foundation

let integer = Int(exactly: false)
print(String(describing: integer)) // prints Optional(0)
Run Code Online (Sandbox Code Playgroud)

#4.使用Intinit(truncating:)初始化程序

import Foundation

let integer = Int(truncating: false)
print(integer) // prints 0
Run Code Online (Sandbox Code Playgroud)

#5.使用控制流程

请注意,以下代码不需要导入Foundation.

用法#1(if语句):

let integer: Int
let bool = false

if bool {
    integer = 1
} else {
    integer = 0
}
print(integer) // prints 0
Run Code Online (Sandbox Code Playgroud)

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

let integer = false ? 1 : 0
print(integer) // prints 0
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 5

您可以使用NSNumber属性intValue:

let x = NSNumber(value: false).intValue
Run Code Online (Sandbox Code Playgroud)

您还可以使用init?(exactly number: NSNumber)初始化程序:

let y = Int(exactly: NSNumber(value: false))
Run Code Online (Sandbox Code Playgroud)

或@Hamish在评论中提到的,数字初始值设定项已重命名为 init(truncating:)

let z = Int(truncating: NSNumber(value: false))
Run Code Online (Sandbox Code Playgroud)

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

let z = Int(truncating: false)
Run Code Online (Sandbox Code Playgroud)

您还有另一个选择是扩展协议BinaryInteger(Swift 4)或Integer(Swift3),并创建自己的不可靠初始化器,该初始化器以Bool作为参数,并使用三元运算符返回原始类型,如@vadian的注释所示:

extension BinaryInteger {
    init(_ bool: Bool) {
        self = bool ? 1 : 0
    }
}
Run Code Online (Sandbox Code Playgroud)
let a = Int(true)   // 1
let b = Int(false)  // 0

let c = UInt8(true)  // 1
let d = UInt8(false) // 0
Run Code Online (Sandbox Code Playgroud)

  • 根据[SE-0170],将要从NSNumber转换为Swift数字类型的init(_ :)初始化程序重命名为init(truncating:)`。(https://github.com/apple/swift-evolution /blob/master/proposals/0170-nsnumber_bridge.md)–所以是Int(截断:NSNumber(值:false))。但是`.intValue`在这种情况下应该达到相同的结果(尽管正如vadian指出的那样,首先不需要为此通过`NSNumber`)。 (5认同)
  • @vadian:`let x = Int(exactly:false)`从布尔值隐式创建一个`NSNumber`。 (2认同)