gpt4 book ai didi

generics - Swift 中没有函数的数组

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

按照泛型和类型约束的指南,我尝试创建一个 Array.without 函数,如下所示:

extension Array {
func without<T: Equatable>(item:T) -> T[] {
return self.map { $0 != item }
}
}

在 Playground 上测试它,我无法让它工作,因为 != 值触发了编译器错误,“找不到 != 的重载接受提供的参数”。

我相信<T: Equatable>应该足以允许使用 !=但显然它没有用。这里缺少什么?

最佳答案

问题是您在方法中定义的T 与实际结构中定义的T 无关。您的本地 T 被限制为 Equatable,但是 TArray 版本仍然不受限制,那就是self.map 为闭包提供了什么。闭包得到一个 Array 类型 T 并且您正在尝试将其与本地 T 进行比较,后者不一定是同一类型。

我认为你能做的最好的事情是这样的:

extension Array {
func without<U : Equatable>(item : U) -> [T] {
return self.filter { $0 as? U != item }
}
}

不幸的是,如果您使用存储在数组中的不同类型的实例调用它,这仍然有效。如果这样做,它只会返回原始数组。它不会让你用一个不等同的实例来调用它。

注意事项:

  1. 我使用 filter 而不是 map 因为这是允许您过滤掉数组内容的方法。 map 用于改变内容
  2. 我更改了 without 以返回一个数组。 filtermap 不修改数组,而是返回根据闭包更改的数组的新版本。

关于generics - Swift 中没有函数的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24175501/

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