我可以使用具有指定关联类型的协议吗?

时间:2017-09-15 08:36:08

标签: swift3

以下代码有效:

protocol GenericStorage {
    associatedtype Value
    func store(value: Value)
}

protocol DataStorage {
    func store(value: Data)
}

struct StringStorage: GenericStorage {
    typealias Value = String

    let wrapped: DataStorage

    func convert(_ str: String) -> Data {
        return Data(str.utf8)
    }

    func store(value: String) {
        wrapped.store(value: convert(value))
    }
}

我是否可以将GenericStorage协议与关联类型Data一起用于wrapped中的StringStorage参数,以避免冗余的DataStorage协议?

我期待类似下面的代码(不工作):

protocol GenericStorage {
    associatedtype Value
    func store(value: Value)
}

struct StringStorage: GenericStorage {
    typealias Value = String

    let wrapped: GenericStorage where Value = Data

    func convert(_ str: String) -> Data {
        return Data(str.utf8)
    }

    func store(value: String) {
        wrapped.store(value: convert(value))
    }
}

1 个答案:

答案 0 :(得分:0)

根据评论,您需要将GenericStorage转换为通用协议。但是,目前,您无法使协议通用。您只能将类型约束添加到associatedType(在Swift4中引入)或协议的函数。

有关通用协议的更多信息,请参阅Generics Manifesto