我是一名学习iOS开发的Android开发人员,我面临着Kotlin/Java接口的琐碎问题,但我无法通过Swift协议解决。
假设我们有这个协议:
protocol ValueStore {
associatedtype Value
var value: Value? { get set }
}
在Kotlin/Java中,如果我想使用通用抽象来定义变量类型,我只需要使用一个带有类型参数的通用接口:
val stringStore: ValueStore<String>
由于这在Swift中是不可能的,我尝试创建一个专门的子协议来定义相关类型:
protocol StringStore: ValueStore where Value == String { }
目的是像这样使用后者:
let stringStore: StringStore
上述声明正是我努力实现的目标。然而编译器告诉我Protocol 'StringStore' can only be used as a generic constraint because it has Self or associated type requirements
。
尽管在类型声明中,我可以使用专门的泛型具体实现,即UserDefaultsValueStore<String>
,但这违反了依赖反转原则。
是否有可能专门化具有相关类型的协议,并且仍然保持抽象级别?
如果我正确理解这个问题。。。试试这个:
protocol ValueStoreType {
associatedtype Value
var value: Value? { get set }
}
struct ValueStore<T>: ValueStoreType {
var value: T?
}
然后你将能够做到:
var stringStore: ValueStore<String>