加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用swift flatMap从数组中过滤掉可选项

发布时间:2020-12-14 05:51:48 所属栏目:百科 来源:网络整理
导读:我对flatMap有点困惑(加入Swift 1.2) 说我有一些可选类型的数组,例如 let possibles:[Int?] = [nil,1,2,3,nil,4,5] 在Swift 1.1中,我会做一个过滤器,然后是这样的地图: let filtermap = possibles.filter({ return $0 != nil }).map({ return $0! })// f
我对flatMap有点困惑(加入Swift 1.2)

说我有一些可选类型的数组,例如

let possibles:[Int?] = [nil,1,2,3,nil,4,5]

在Swift 1.1中,我会做一个过滤器,然后是这样的地图:

let filtermap = possibles.filter({ return $0 != nil }).map({ return $0! })
// filtermap = [1,5]

我一直试图用flatMap这样做:

var flatmap1 = possibles.flatMap({
    return $0 == nil ? [] : [$0!]
})

var flatmap2:[Int] = possibles.flatMap({
    if let exercise = $0 { return [exercise] }
    return []
})

我更喜欢最后一个方法(因为我不需要执行一个强制解开$ 0!…我很害怕这些,并且不惜一切代价避免它们),除了我需要指定Array类型。

有没有其他的选择,通过上下文来确定类型,但是没有强制的展开?

使用Swift 2 b1,你可以简单地做
let possibles:[Int?] = [nil,5]
let actuals = possibles.flatMap { $0 }

对于早期版本,您可以使用以下扩展名来填充它:

extension Array {
    func flatMap<U>(transform: Element -> U?) -> [U] {
        var result = [U]()
        result.reserveCapacity(self.count)
        for item in map(transform) {
            if let item = item {
                result.append(item)
            }
        }
        return result
    }
}

一个警告(Swift 2也是如此),你可能需要显式地键入转换的返回值:

let actuals = ["a","1"].flatMap { str -> Int? in
    if let int = str.toInt() {
        return int
    } else {
        return nil
    }
}
assert(actuals == [1])

有关更多信息,请参阅http://airspeedvelocity.net/2015/07/23/changes-to-the-swift-standard-library-in-2-0-betas-2-5/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读