一尘不染

快速使用协议作为数组类型和函数参数

swift

我想创建一个类,可以存储符合特定协议的对象。对象应存储在类型数组中。根据Swift文档协议可以用作类型:

由于它是一种类型,因此可以在允许使用其他类型的许多地方使用协议,包括:

  • 作为函数,方法或初始化程序中的参数类型或返回类型
  • 作为常量,变量或属性的类型
  • 作为数组,字典或其他容器中项目的类型

但是,以下内容会生成编译器错误:

协议“ SomeProtocol”只能用作通用约束,因为它具有“自我”或相关的类型要求

您应该如何解决这个问题:

protocol SomeProtocol: Equatable {
    func bla()
}

class SomeClass {

    var protocols = [SomeProtocol]()

    func addElement(element: SomeProtocol) {
        self.protocols.append(element)
    }

    func removeElement(element: SomeProtocol) {
        if let index = find(self.protocols, element) {
            self.protocols.removeAtIndex(index)
        }
    }
}

阅读 216

收藏
2020-07-07

共1个答案

一尘不染

您在Swift中遇到了协议问题的一个变体,目前尚无好的解决方案。

另请参见扩展数组以检查它是否在Swift中排序?,其中包含有关如何解决该问题的建议,这些建议可能适合您的特定问题(您的问题非常笼统,也许您可​​以使用这些答案找到解决方法)。

2020-07-07