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

Swift 如何从可选Int初始化可选UInt?,swift,type-conversion,optional,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?(_

我想将可选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)
       }
   }
}

是否有一种方法可以将
Int?
转换为
UInt?
,而无需使用扩展名或条件检查(if,guard)

您可以使用创建它,如果它为nil,则传递默认值

let optionalPositiveNumber = UInt(optionalNumber ?? 0)
因此,如果您的optionalNumber为零,它将初始化为0

编辑建议人

如果作为
source
传递的值不能准确表示,则返回结果 是
nil


您可以
map

var optionalNumber : Int?

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

当此可选实例不是nil时,计算给定的闭包,并将未包装的值作为参数传递

func映射(uTransform:(Wrapped)抛出->U)再抛出->U?

因此,结果是请求的
UInt?
,或者是
nil
,或者是转换后的有符号数

请注意,转换将失败(并因运行时异常而崩溃) 如果给定的数字是负数。如果这是一个问题,一个更好的变体 可能是


如果给定的数字是
nil
或负值,则返回
nil

??也是一个条件。@U.Benlice它将用于nilYes的情况,我知道。但他想要一个无条件的解决方案。首先这是一个条件。此外,您的解决方案不会生成可选UInt。您正在以零为单位创建零值。
让optionalPositionEnumber=UInt(确切地说:optionalNumber???-1)
nil
将映射为
nil
,负数将为
nil
。请尝试我建议的代码。如果原始数字为正数,则会得到一个具有预期值的
UInt?
。如果原始数字为负数或
nil
,它将为您提供
nil
var optionalNumber : Int?

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