如何定义专门用于泛型协议的协议,以便在类型声明中使用它



我是一名学习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>

最新更新