gpt4 book ai didi

swift - 有没有办法测试数组的类型是否可选?

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:27 25 4
gpt4 key购买 nike

假设我想在 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 中的讨论.

关于swift - 有没有办法测试数组的类型是否可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28229599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com