17

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

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

转换为 Swift4 后,我收到“'init' is deprecated”警告。这应该怎么做?

4

2 回答 2

26

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


#1。使用NSNumberintValue属性

import Foundation

let integer = NSNumber(value: false).intValue
print(integer) // prints 0

#2。使用类型转换

import Foundation

let integer = NSNumber(value: false) as? Int
print(String(describing: integer)) // prints Optional(0)

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

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)

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

import Foundation

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

#5。使用控制流

请注意,以下示例代码不需要导入 Foundation。

用法 #1(if 语句):

let integer: Int
let bool = false

if bool {
    integer = 1
} else {
    integer = 0
}
print(integer) // prints 0

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

let integer = false ? 1 : 0
print(integer) // prints 0
于 2017-06-07T21:48:13.450 回答
5

您可以使用 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 隐式地从它创建一个 NSNumber,正如@MartinR 提到的那样

let 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
于 2017-06-07T19:23:03.990 回答