Swift 通用数组 Equatable 铸造
Swift Generic array Equatable casting
我有一个 class AAA,其中包含一个通用数组。
由于 Item 可能不是 Equatable,所以我没有将其编码为 class AAA<Item: Equatable>
.
我想在 class AAA 中添加一个删除函数,当 Item 为 Equatable 时可用。通过调用这个函数,它会调用Array Extension中的一个函数。
由于Item默认不是Equatable,下面的代码无法编译。
class AAA<Item>
{
var items = [Item]()
func remove(item: Item)
{
items.remove(object: item)
}
}
extension Array where Element: Equatable
{
// Remove first collection element that is equal to the given `object`:
mutating func remove(object: Element)
{
if let index = index(of: object)
{
remove(at: index)
}
}
}
在下一步中,我尝试将 items 和 item 转换为 Equatable。但是,我找不到任何方法来检查 items 数组并将其转换为具有 Equatable 元素的数组。
func remove<ItemEquatable: Item> (item: ItemEquatable) where ItemEquatable: Equatable
{
items.remove(object: item)
}
有什么想法或建议吗?谢谢
如果Item
是可等式的,则只为AAA<Item>
定义函数,
只需将定义放入 class:
的受限扩展
class AAA<Item> {
var items = [Item]()
}
extension AAA where Item: Equatable {
func remove(item: Item) {
items.remove(object: item)
}
}
您的方法无效,因为您仍然可以调用删除
任何 AAA<Item>
实例上的方法,而不 Item
是 Equatable
.
换句话说:你需要限制泛型Item
class 的参数类型,而不是 remove()
.
的参数类型
我有一个 class AAA,其中包含一个通用数组。
由于 Item 可能不是 Equatable,所以我没有将其编码为 class AAA<Item: Equatable>
.
我想在 class AAA 中添加一个删除函数,当 Item 为 Equatable 时可用。通过调用这个函数,它会调用Array Extension中的一个函数。
由于Item默认不是Equatable,下面的代码无法编译。
class AAA<Item>
{
var items = [Item]()
func remove(item: Item)
{
items.remove(object: item)
}
}
extension Array where Element: Equatable
{
// Remove first collection element that is equal to the given `object`:
mutating func remove(object: Element)
{
if let index = index(of: object)
{
remove(at: index)
}
}
}
在下一步中,我尝试将 items 和 item 转换为 Equatable。但是,我找不到任何方法来检查 items 数组并将其转换为具有 Equatable 元素的数组。
func remove<ItemEquatable: Item> (item: ItemEquatable) where ItemEquatable: Equatable
{
items.remove(object: item)
}
有什么想法或建议吗?谢谢
如果Item
是可等式的,则只为AAA<Item>
定义函数,
只需将定义放入 class:
class AAA<Item> {
var items = [Item]()
}
extension AAA where Item: Equatable {
func remove(item: Item) {
items.remove(object: item)
}
}
您的方法无效,因为您仍然可以调用删除
任何 AAA<Item>
实例上的方法,而不 Item
是 Equatable
.
换句话说:你需要限制泛型Item
class 的参数类型,而不是 remove()
.