gpt4 book ai didi

arrays - 具有可相等元素的数组的 Swift 扩展无法调用索引(:)

转载 作者:搜寻专家 更新时间:2023-11-01 06:17:34 25 4
gpt4 key购买 nike

我正在尝试在 Swift 中为 Array 类型添加一个扩展,仅限于其元素符合 equatable 协议(protocol)的 Arrays。我试图以下列方式定义一个函数:

import Foundation

extension Array where Iterator.Element: Equatable {

func deletedIndicies<T: Equatable>(newArray: [T]) -> [Int] {

var indicies = [Int]()

for element in self {

if newArray.index(of: element) == nil {

indicies.append(self.index(of: element)!)
}
}

return indicies
}
}
}

该函数的目的是返回原始数组中未出现在 newArray 中的任何项目的索引。

我在 Xcode 中收到的错误是:无法使用类型为“(of: Element)”的参数列表调用“index”

因为我只为元素可相等的数组定义函数,并且要求 newArray 的元素是可相等的,所以我不确定为什么我不能调用 index 方法。

最佳答案

问题是您在方法中定义了一个新的通用占位符T——它不一定与Element 是同一类型。因此,当你说 newArray.index(of: element) 时,你试图将一个 Element 传递给 T 类型的参数。

因此,解决方案是简单地将 newArray: 参数键入为 [Element]:

extension Array where Element : Equatable {
func deletedIndicies(byKeeping elementsToKeep: [Element]) -> [Int] {
// ...
}
}

作为旁注,此方法也可以实现为:

extension Array where Element : Equatable {

func deletedIndicies(byKeeping elementsToKeep: [Element]) -> [Int] {

// use flatMap(_:) to iterate over a sequence of pairs of elements with indices,
// returning the index of the element, if elementsToKeep doesn't contains it,
// or nil otherwise, in which case flatMap(_:) will filter it out.
return self.enumerated().flatMap {
elementsToKeep.contains($1) ? nil : $0
}
}
}

此外,如果将 Element 上的约束更改为 Hashable,这也可以在 O(n) 内实现,而不是 O(n * m) 时间,这可能是可取的:

extension Array where Element : Hashable {

func deletedIndicies(byKeeping elementsToKeep: [Element]) -> [Int] {

// create new set of elements to keep.
let setOfElementsToKeep = Set(elementsToKeep)

return self.enumerated().flatMap {
setOfElementsToKeep.contains($1) ? nil : $0
}
}
}

关于arrays - 具有可相等元素的数组的 Swift 扩展无法调用索引(:),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41045212/

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