通过应用过滤器摆脱 nil 后将类型更改为非可选

Posted

技术标签:

【中文标题】通过应用过滤器摆脱 nil 后将类型更改为非可选【英文标题】:Change type to non-optional after get rid of nils by applying filter 【发布时间】:2020-12-23 09:53:12 【问题描述】:
let elements: [(Int?, Int?)] = [(1, 2), (2, 1), (3, nil), (nil, 3), (5, 6), (6, 5)]
let result = elements.filter  $0.0 != nil  as! [(Int, Int?)]

有没有更简洁的方法来获得部分非可选类型?无需强制解包... 当我们过滤掉 nil 时,编译器应该很明显我们会得到一些非可选的东西。就像我们应用 compactMap 的情况一样。

【问题讨论】:

【参考方案1】:

这是一种无需强制解包但仍然可读的方法:

let result = elements.compactMap  $0 as? (Int, Int?) 

打印出result表明它可以工作:

[(1, Optional(2)), (2, Optional(1)), (3, nil), (5, Optional(6)), (6, Optional(5))]

【讨论】:

【参考方案2】:

我能想到的不强制解包 (!) 的唯一方法是:

let result = elements.compactMap  (x, y) in x.map  ($0, y)  

但这牺牲了可读性。老实说,我只会保持原力展开。这不是一个“绝对邪恶”的事情。有时你需要它。

【讨论】:

以上是关于通过应用过滤器摆脱 nil 后将类型更改为非可选的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 在非可选的字符串上返回 nil

iOS Core Data - 用于将关系从非可选更改为可选的轻量级迁移

Swift:在运行时在非可选中检测到意外的 nil 值:强制转换为可选失败

防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法

Swift之深入解析如何处理非可选的可选项类型

不能对“ViewController”类型的非可选值使用可选链接