Swift通用数组Equatable cast

时间:2017-06-09 09:14:03

标签: arrays swift generics equatable

我有一个AAA类,它包含一个通用数组。 由于 Item 可能不是Equatable,因此我不会将其编码为class AAA<Item: Equatable>

我想在类AAA中添加一个remove函数,当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)
        }
    }
}

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

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

有任何想法或建议吗?感谢

1 个答案:

答案 0 :(得分:2)

如果AAA<Item>是等价的,则仅为Item定义函数, 只需将定义放入类的受限扩展中:

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

extension AAA where Item: Equatable {

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

您的方法无效,因为您仍然可以调用删除 任何AAA<Item>个实例上的方法,ItemEquatable

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