当我创建一个依赖于泛型类型的计算属性时,当在泛型函数中传递实例时,特定的实现会“丢失”。
例如,我添加了isBool上Array说回报true,如果Array.Element是Bool:
extension Array {
var isBool: Bool {
false
}
}
extension Array where Element == Bool {
var isBool: Bool {
true
}
}
Run Code Online (Sandbox Code Playgroud)
直接在实例上使用它工作正常
let boolArray: [Bool] = [true, false]
let intArray: [Int] = [1, 0]
boolArray.isBool // true
intArray.isBool // false
Run Code Online (Sandbox Code Playgroud)
但是在泛型函数中,它总是使用非专门化的实现:
func isBool<Element>(_ array: [Element]) -> Bool {
array.isBool
}
isBool(boolArray) // false, instead of true
isBool(intArray) // false
Run Code Online (Sandbox Code Playgroud)
这不是一个真正的用例,所以我真的不需要一种方法来“修复”这个问题,但我想了解它为什么会这样。