首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从optional Int初始化optional UInt?

如何从optional Int初始化optional UInt?
EN

Stack Overflow用户
提问于 2018-05-31 17:21:01
回答 2查看 686关注 0票数 2

我想将可选的Int转换为可选的UInt:

代码语言:javascript
复制
let optionalNumber : Int?
//later in code
let optionalPositiveNumber = UInt(optionalNumber)

给出错误:

代码语言:javascript
复制
Cannot invoke initializer for type 'Uint' with an argument list of type (Int?)

我可以通过为UInt创建以下扩展来解决这个问题:

代码语言:javascript
复制
extension UInt {
   init?(_ number : Int?) {
       if let number = number {
           self = UInt(number)
       }
   }
}

有没有办法在不使用扩展或条件检查(if,UInt? )的情况下将Int?转换为UInt?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-31 17:24:44

您可以对可选参数执行map操作:

代码语言:javascript
复制
var optionalNumber : Int?

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

documentation:

当此可选实例不为nil时,

会计算给定的闭包,并将展开后的值作为参数传递。

func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?

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

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

代码语言:javascript
复制
let optionalPositiveNumber = optionalNumber.flatMap { UInt(exactly: $0) }

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

票数 6
EN

Stack Overflow用户

发布于 2018-05-31 17:23:29

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

代码语言:javascript
复制
let optionalPositiveNumber = UInt(optionalNumber ?? 0)

因此,如果您的optionalNumber为空,它将被初始化为0

建议的编辑

代码语言:javascript
复制
let optionalPositiveNumber = UInt(exactly: optionalNumber ?? -1)

如果作为source传递的值不能精确表示,则结果为nil

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50620840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档