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

swift – 有没有办法测试Array的类型是否是可选的?

发布时间:2020-12-14 04:33:08 所属栏目:百科 来源:网络整理
导读:假设我想在Array上编写一个方法,如果数组的类型是非可选的,则返回数组的副本,如果类型是可选的,则返回未包装的值的子数组.为此,我认为我需要能够测试Array的类型T是否是可选类型.例如,这只是在任何一种情况下返回数组的副本: extension Array { func unwrap
假设我想在Array上编写一个方法,如果数组的类型是非可选的,则返回数组的副本,如果类型是可选的,则返回未包装的值的子数组.为此,我认为我需要能够测试Array的类型T是否是可选类型.例如,这只是在任何一种情况下返回数组的副本:

extension Array {        
    func unwrapped() -> Array<T> {
        return filter({
            var x: T? = $0
            return x != nil
        })
    }
}

据我所知,如果我知道我有一组可选项,我可以使用filter()和map():

let foo: [String?] = [nil,"bar","baz"]
let bar: [String] = foo.filter({ $0 != nil }).map({ $0! })

我不是在寻找解决这个问题的方法.相反,我想知道是否有一种方法可以在Array扩展中确定它的类型是否是可选的,这在许多不同的便利方法中都很有用.

解决方法

一种可能的解决方案是使用全局函数而不是扩展;然后你可以重载两个定义,一个用于非可选,一个用于可选类型:

func unwrapped<T>(a: [T]) -> [T] { return a }
func unwrapped<T>(a: [T?]) -> [T] {
    return a.filter { $0 != nil }.map { $0! }
}

unwrapped([1,2,3,4,5]) // -> [1,5]
unwrapped([1,nil,5]

我不确定这是否可以保证有效;如果有人可以找到一个案例,或者在Swift指南中某个地方说它始终是正确的,那将会很有趣.

另见this question中的讨论.

(编辑:李大同)

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

    推荐文章
      热点阅读