以下代码有效:
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))
}
}
答案 0 :(得分:0)
根据评论,您需要将GenericStorage
转换为通用协议。但是,目前,您无法使协议通用。您只能将类型约束添加到associatedType(在Swift4中引入)或协议的函数。
有关通用协议的更多信息,请参阅Generics Manifesto。