gpt4 book ai didi

arrays - 如何将返回符合 Equatable 的值的闭包传递给函数

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

我正在尝试创建 Array 的扩展,它根据应用了闭包的项目返回一个新的唯一项目数组。

例如:如果我有一个 Apple 数组,其中 apple 具有属性 name 和 origin,为了获得每个来源的一个 Apple,我将调用 apple.uniqued(on: { $0.原点})

这是我目前的代码:

extension Array where Element: Equatable {
func uniqued(on extract: (Element) -> Equatable) { // A
let elementsAndValues = map { (item: $0, extracted: extract($0)) } // 1

var uniqueValues: [Element] = []
var uniqueExtracts: [Equatable] = [] // A

elementsAndValues.forEach { (item, extracted) in
if !uniqueExtracts.contains(extracted) { // 3, B
uniqueValues += [item]
uniqueExtracts += [extracted]
}
}

return uniqueValues
}
}

这应该按如下方式工作:

  1. 创建一个包含原始元素(项目)和应用(提取)闭包的元素的元组数组
  2. 如果 uniqueExtracts 不包含该项目,则添加它并将该项目添加到 uniqueItems 数组。

我得到的错误是:

A) “协议(protocol)‘SomeProtocol’只能用作通用约束,因为它有 self 或关联类型要求”(两次)

B) “调用中缺少参数标签‘where:’”

我使用的是最新版本的 Xcode。任何建议都会有很大帮助。非常感谢。

最佳答案

您有多个问题混合在一起导致您看到的错误。您应该做的是使用泛型。

extension Array
{
func uniqued<T:Equatable>(on extract:(Array.Element) -> T) -> [Array.Element]
{
let elementsAndValues = self.map{ (item: $0, extracted: extract($0)) }

var uniqueValues:[Element] = []
var uniqueExtracts:[T] = []

for (item, extracted) in elementsAndValues
{
if !uniqueExtracts.contains(extracted)
{
uniqueValues.append(item)
uniqueExtracts.append(extracted)
}
}

return uniqueValues
}
}

<T:Equatable>声明一个泛型类型参数 T符合 Equatable .然后函数签名可以期待一个返回一些通用类型的闭包 T我们知道符合 Equatable来自尖括号中的类型约束。您还必须更改每次出现的 Equatable到通用参数 T , 自 Equatable不是真实类型;见my answer here .如果这样做,代码应该可以编译。

您还有其他一些可能应该更改的内容:

  • 而不是使用 elementsAndValues.forEach(:) , 使用 for <pattern> in list {}循环。

  • 虽然这是有争议的,但您或许应该使用 Array().append(:)方法而不是 +=向数组添加一个元素时的连接。在+=的情况下,而不是 + ,这纯粹是为了传达意图。

  • 您没有为您的函数声明返回类型,因此编译器假定它返回 Void ,所以 return uniqueValues语句将导致编译器错误。添加 -> [Array.Element]到修复此问题的函数。

  • where Element:Equatable作为对 Array 的约束本身就是多余的。您正在使用键函数来确定相等性,因此元素本身是否相等是无关紧要的。

  • 您可能想使用 Set或其他一些哈希数据结构而不是 uniqueExtracts大批。测试数组中的成员资格是一个 O(n)操作。

关于arrays - 如何将返回符合 Equatable 的值的闭包传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43640012/

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