"'初始化'已被弃用" Swift4转换后的警告

时间:2017-06-07 19:20:45

标签: swift swift4

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

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

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

2 个答案:

答案 0 :(得分:21)

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

#1。使用NSNumber的{​​{1}}属性

intValue

#2。使用类型转换

import Foundation

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

#3。使用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)

#4。使用import Foundation let integer = Int(exactly: false) print(String(describing: integer)) // prints Optional(0) 的{​​{3}}初始值设定项

Int

#5。使用控制流程

请注意,以下代码不需要导入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

中隐含地创建一个NSNumber
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