【问题标题】:Swift Generic array Equatable castingSwift 通用数组 Equatable 强制转换
【发布时间】:2017-06-09 09:14:03
【问题描述】:

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

我想在 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)
        }
    }
}

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

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

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

【问题讨论】:

    标签: arrays swift generics equatable


    【解决方案1】:

    如果Item 是等价的,则只为AAA&lt;Item&gt; 定义函数, 只需将定义放入类的受限扩展中即可:

    class AAA<Item> {
        var items = [Item]()
    }
    
    extension AAA where Item: Equatable {
    
        func remove(item: Item) {
            items.remove(object: item)
        }
    }
    

    您的方法行不通,因为您仍然可以调用 remove 任何AAA&lt;Item&gt; 实例上的方法,而Item 不是Equatable

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多