可以采用符合协议

时间:2017-05-05 09:52:59

标签: swift

如果我创建协议......

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

1 个答案:

答案 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))
    }