假设我想在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, 2, 3, 4, 5] unwrapped([1, 2, 3, nil, 5]) // -> [1, 2, 3, 5]
我不确定这是否可以保证有效;如果有人可以找到一个案例,或者在Swift指南中某个地方说它始终是正确的,那将会很有趣.
另见this question中的讨论.