gpt4 book ai didi

generics - 通用扩展的快速类型约束

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

经过一些压力,我创建了以下通用函数:

func removeDupes<T : Hashable > (inout inputCollection : [T] ) -> [T] {
var hashMap = [T : Bool]()
var output = 0
for thing in inputCollection {
if !hashMap[thing] {
hashMap[thing] = true
inputCollection[output++] = thing
}
}
while (inputCollection.count > output) {
inputCollection.removeLast()
}
return inputCollection
}

所以当你这样做的时候:

var names = ["Bob", "Carol", "Bob", "Bob", "Carol", "Ted", "Ted", "Alice", "Ted", "Alice"]
removeDupes(&names)

名称将包含:["Bob", "Carol","Ted", "Alice"]

现在我想一般地添加“removeDupes”作为 Array 上的扩展方法,但我对语法感到困惑,因为我必须将它限制为一个 Hashable 项的数组。

我希望我可以这样声明:

extension Array {
func removeDupes< T : Hashable> () -> [T] {
return removeDupes(&self)
}
}

但是我得到了错误:

数组不可转换为'@lvalue inout $T5'

我怀疑答案是“你这个白痴,做这个……”或者“你做不到”

会是哪个? :-D

最佳答案

Array 类声明如下:

public struct Array<Element>

从 Swift 2.0 开始,您可以仅为通用 Element 参数符合协议(protocol)的实例创建扩展方法:

extension Array where Element: Hashable {
@warn_unused_result
func removeDupes() -> [Element] {
var hashMap = [Element : Bool]()
var result = [Element]()

for thing in self {
if hashMap[thing] == nil {
hashMap[thing] = true
result.append(thing)
}
}
return result
}
}

注意扩展声明中的where 语句。这样,removeDupes 方法仅针对 Hashable 元素的数组声明:

let names = ["Bob", "Carol", "Bob", "Bob", "Carol", "Ted", "Ted", "Alice", "Ted", "Alice"]
let uniqueNames = names.removeDupes() // returns ["Bob", "Carol", "Ted", "Alice"]

关于generics - 通用扩展的快速类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24897507/

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