我想将可选的Int转换为可选的UInt:
let optionalNumber : Int?
//later in code
let optionalPositiveNumber = UInt(optionalNumber)
给出错误:
Cannot invoke initializer for type 'Uint' with an argument list of type (Int?)
我可以通过为UInt创建以下扩展来解决这个问题:
extension UInt {
init?(_ number : Int?) {
if let number = number {
self = UInt(number)
}
}
}
有没有办法在不使用扩展程序或条件检查(if,guard)的情况下将Int?
转换为UInt?
?
答案 0 :(得分:6)
您可以map
选项:
var optionalNumber : Int?
//later in code
let optionalPositiveNumber = optionalNumber.map { UInt($0) }
当此Optional实例不为nil时,计算给定的闭包,将未包装的值作为参数传递。
func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?
因此,结果是UInt?
根据要求,并且是nil
或已转换的签名号码。
请注意,转换将失败(并因运行时异常而崩溃) 如果给定的数字为负。如果这是一个问题,那就是一个更好的变体 可能是
let optionalPositiveNumber = optionalNumber.flatMap { UInt(exactly: $0) }
如果给定的数字为nil
或为负数,则返回nil
。
答案 1 :(得分:3)
您可以使用 ?? 创建它,如果它是nil
则传递默认值let optionalPositiveNumber = UInt(optionalNumber ?? 0)
因此,如果您的optionalNumber为nil,则将初始化为0
vacawama建议的编辑
let optionalPositiveNumber = UInt(exactly: optionalNumber ?? -1)
如果以
source
传递的值无法准确表示,则结果 是nil
。