Swift 具有相等元素的数组扩展无法调用 Index(of:)
Swift Extension of Array with Equatable Elements Cannot Call Index(of:)
我正在尝试为 Swift 中的 Array 类型添加一个扩展,仅限于其元素符合 equatable 协议的 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
}
}
}
该函数的目的是 return 原始数组中未出现在 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() ? nil : [=11=]
}
}
}
此外,如果将 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() ? nil : [=12=]
}
}
}
我正在尝试为 Swift 中的 Array 类型添加一个扩展,仅限于其元素符合 equatable 协议的 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
}
}
}
该函数的目的是 return 原始数组中未出现在 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() ? nil : [=11=]
}
}
}
此外,如果将 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() ? nil : [=12=]
}
}
}