协议功能可以采用任何符合协议的类型



如果我创建协议...

protocol MyProtocol {
    var someArray: [String] { get }
    init(someArray: [String])
    func adding(_ other: Self) -> Self
}
extension MyProtocol {
    func adding(_ other: Self) -> Self {
        return Self(someArray: someArray + other.someArray)
    }
}

然后我可以创建一个符合它的结构...

struct Foo: MyProtocol {
    let someArray: [String]
}

现在我可以创建两个Foos并将它们加在一起。

但是,如果我创建了另一个符合MyProtocol ...

的结构
struct Bar: MyProtocol {
    let someArray: [String]
}

那么现在我做不到...

let foo = Foo(["Hello", "World"])
let bar = Bar(["Goodbye"])
let fooBar = foo.adding(bar)

因为该功能要求other的类型与您在功能上运行的类型相同。

是否有可能没有此限制?只要它们都符合MyProtocol

思想

嗯...也许我正在考虑以错误的方式解决这个问题?我想我可以通过从函数的输入参数中删除Self要求来解决此问题,而仅将[String]用作输入参数。

您的问题是Self要求。但是您不需要它,至少在争论方面不需要。您只需要符合MyProtocol的东西,以便您可以从中取someArray并创建Self的新实例:

protocol MyProtocol {
   var someArray: [String] { get }
   init(someArray: [String])
   func adding(_ other: MyProtocol) -> Self
}
extension MyProtocol {
   func adding(_ other: MyProtocol) -> Self {
       return Self(someArray: someArray + other.someArray)
   }
}

最新更新