gpt4 book ai didi

ios - 通过 Element 属性使 `Collection` 协议(protocol)唯一

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

我一直在尝试使这个扩展通用,但没有成功。任何想法如何改进它? (我想摆脱硬编码的 WKBackForwardListItemurl 部分,只接受任何属性)但恐怕这还不可能吗?

extension Collection where Iterator.Element: WKBackForwardListItem {
func unique() -> [Iterator.Element] {
var seen: [Iterator.Element] = []

for element in self {
if seen.map({ $0.url }).contains(element.url) == false {
seen.append(element)
}
}

return seen
}
}

理想情况下签名会这样结束

func unique(by property: Property) -> [Iterator.Element] {

更新

鉴于数组的性质,WKWebView 历史记录。保持数组的顺序非常重要。所以每次使用 Set 都是不可能的。

更新 2

结果代码是,我丢失了 Collection 协议(protocol),但这对于这个例子来说没问题。

extension Array where Iterator.Element: Equatable, Iterator.Element: Hashable {
func unique() -> [Iterator.Element] {
return NSOrderedSet(array: self).array as! [Iterator.Element]
}
}

谢谢!

最佳答案

您不需要创建Collection 的这个扩展。您需要的是一个 Set。您唯一需要确保的是数组中的项目符合 Equatable 协议(protocol)。

示例:

let food = ["taco", "apple", "pizza", "taco"]
let uniqueFood = Set(food) // ["taco", "apple", "hot dog"]

然后您需要做的就是从该 Set 创建一个 Array:

let foodArray = Array()

对于您的用例,WKBackForwardListItem 确实符合 Equatable,因此您不需要为此做任何特殊的事情。

为了维护你的数据的顺序Apple提供了NSOrderedSet。这具有 Set 提供的独特性,同时保持 Array 提供的顺序。

希望对您有所帮助。

关于ios - 通过 Element 属性使 `Collection` 协议(protocol)唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41815689/

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