我想将可选的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,UInt? )的情况下将Int?转换为UInt??
发布于 2018-05-31 17:24:44
您可以对可选参数执行map操作:
var optionalNumber : Int?
//later in code
let optionalPositiveNumber = optionalNumber.map { UInt($0) }当此可选实例不为nil时,
会计算给定的闭包,并将展开后的值作为参数传递。
func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?
因此,结果是请求的UInt?,或者是nil,或者是转换后的有符号数字。
请注意,如果给定的数字为负数,则转换将失败(并因运行时异常而崩溃)。如果这是一个问题,一个更好的变种可能是
let optionalPositiveNumber = optionalNumber.flatMap { UInt(exactly: $0) }如果给定的数字为nil或负数,则返回nil。
发布于 2018-05-31 17:23:29
可以使用??创建它,如果为空,则传递默认值
let optionalPositiveNumber = UInt(optionalNumber ?? 0)因此,如果您的optionalNumber为空,它将被初始化为0
建议的编辑
let optionalPositiveNumber = UInt(exactly: optionalNumber ?? -1)如果作为
source传递的值不能精确表示,则结果为nil。
https://stackoverflow.com/questions/50620840
复制相似问题