小编rra*_*ael的帖子

为什么泛型特化在泛型函数中丢失

当我创建一个依赖于泛型类型的计算属性时,当在泛型函数中传递实例时,特定的实现会“丢失”。

例如,我添加了isBoolArray说回报true,如果Array.ElementBool

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)

这不是一个真正的用例,所以我真的不需要一种方法来“修复”这个问题,但我想了解它为什么会这样。

generics swift

5
推荐指数
1
解决办法
78
查看次数

标签 统计

generics ×1

swift ×1