如何从可选的Int初始化可选的UInt?

时间:2018-05-31 09:21:01

标签: swift type-conversion optional

我想将可选的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?

2 个答案:

答案 0 :(得分:6)

您可以map选项:

var optionalNumber : Int?

//later in code
let optionalPositiveNumber = optionalNumber.map { UInt($0) }

来自documentation:

  

当此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