通过应用过滤器摆脱 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 后将类型更改为非可选的主要内容,如果未能解决你的问题,请参考以下文章
iOS Core Data - 用于将关系从非可选更改为可选的轻量级迁移
Swift:在运行时在非可选中检测到意外的 nil 值:强制转换为可选失败