您可以简单地有条件地将[T?] 转换为[T],如果数组不包含 nil 元素,这将成功:
let x: [Int?] = [1, 2, 3, 4]
print(x as? [Int]) // Optional([1, 2, 3, 4])
let y: [Int?] = [1, 2, nil, 3, 4]
print(y as? [Int]) // nil
作为Array的扩展方法
extension Array {
func someFunction<T>() -> [T]? where Element == Optional<T> {
return self as? [T]
}
}
以前的更复杂的解决方案:
您可以使用compactMap() 获取非零元素,然后检查它是否与原始元素数量相同:
extension Array {
func someFunction<T>() -> [T]? where Element == Optional<T> {
let nonNils = compactMap { $0 }
return nonNils.count == count ? nonNils : nil
}
}
(这里使用Swift: Extension on [<SomeType<T>?] to produce [<T>?] possible? 的方法来定义可选元素数组的扩展方法。)
例子:
let x: [Int?] = [1, 2, 3, 4]
print(x.someFunction()) // Optional([1, 2, 3, 4])
let y = [1, 2, nil, 3, 4]
print(y.someFunction()) // nil
另一种选择,只是为了好玩:如果您为可选项定义“解包或抛出”方法
extension Optional {
struct FoundNilError : Error { }
func unwrapOrThrow() throws -> Wrapped {
switch self {
case .some(let wrapped) : return wrapped
case .none: throw FoundNilError()
}
}
}
然后您可以将其与map 和“可选尝试”一起使用:
extension Array {
func someFunction<T>() -> [T]? where Element == Optional<T> {
try? map { try $0.unwrapOrThrow() }
}
}
一旦找到 nil 元素,map 就会抛出错误,try? 返回nil。