如果我创建协议......
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
?
THOUGHTS
嗯......也许我正在考虑以错误的方式解决这个问题?我想我可以通过从函数的输入参数中删除Self
要求并使用[String]
作为输入参数来解决这个问题。
答案 0 :(得分: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)
}
}
的新实例:
func converByteToGB(_ bytes:Int64) -> String {
let formatter:ByteCountFormatter = ByteCountFormatter()
formatter.countStyle = .binary
return formatter.string(fromByteCount: Int64(bytes))
}