1

我有一个包含通用数组的 AAA 类。由于Item可能不是 Equatable,所以我不将其编码为class AAA<Item: Equatable>.

我想在 AAA 类中添加一个删除函数,该函数在 Item 为 Equatable 时可用。通过调用这个函数,它将调用数组扩展中的一个函数。

由于默认情况下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)
        }
    }
}

在下一步中,我尝试将项目项目转换为 Equatable。但是,我找不到任何方法来检查items数组并将其转换为具有 Equatable 元素的数组。

func remove<ItemEquatable: Item> (item: ItemEquatable) where ItemEquatable: Equatable
{
    items.remove(object: item)
}

有什么想法或建议吗?谢谢

4

1 回答 1

2

要仅为AAA<Item>if Itemis equatable 定义函数,只需将定义放入类的受限扩展中:

class AAA<Item> {
    var items = [Item]()
}

extension AAA where Item: Equatable {

    func remove(item: Item) {
        items.remove(object: item)
    }
}

您的方法不起作用,因为您仍然可以在任何AAA<Item>实例上调用 remove 方法,而Item不是Equatable.

换句话说:您需要限制Item 类的泛型类型,而不是remove().

于 2017-06-09T09:40:32.803 回答