2017-05-05 86 views
0

任何类型的...协议功能,可以采取如果我创建一个协议符合协议

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 ...

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]作为输入参数来解决此问题。

回答

2

你说得对,你的问题是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) 
    } 
} 
+0

啊!不知何故,这让我过去了。我认为自我要求是针对整个事情的。谢谢:D嗯......当我尝试说它只能用作通用约束,因为它有自己的需求?稍后再看看。感谢:D – Fogmeister