Swift4 转换后出现“'init' 已弃用”警告
"'init' is deprecated" warning after Swift4 convert
在 Swift3 中,我之前使用以下方法将 Bool 转换为 Int
let _ = Int(NSNumber(value: false))
转换为 Swift4 后,我收到“'init' 已弃用”警告。还应该怎么做?
你可以使用 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 作为参数并且 returns 使用三元运算符的原始类型,如@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
使用Swift 4.2和Swift 5,您可以选择以下5种解决方案之一来解决您的问题。
#1。使用 NSNumber
的 intValue
属性
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。使用 Int
的 init(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。使用 Int
的 init(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
在 Swift3 中,我之前使用以下方法将 Bool 转换为 Int
let _ = Int(NSNumber(value: false))
转换为 Swift4 后,我收到“'init' 已弃用”警告。还应该怎么做?
你可以使用 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 作为参数并且 returns 使用三元运算符的原始类型,如@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
使用Swift 4.2和Swift 5,您可以选择以下5种解决方案之一来解决您的问题。
#1。使用 NSNumber
的 intValue
属性
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。使用 Int
的 init(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。使用 Int
的 init(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