创建了一个通用协议,并创建了一个专用协议,它解析了所有通用参数。
尝试将专用协议用作变量类型时,Xcode给出以下错误:Protocol 'MY_SPECIALIZED_PROTOCOL_NAME' can only be used as a generic constraint because it has Self or associated type requirements
尝试以下代码。
protocol GenericFetching {
associatedtype FetchEntity
associatedtype FetchOptions
associatedtype FetchResult = Result<FetchEntity, Swift.Error>
}
protocol BananaService: class, GenericFetching where
FetchEntity == [Banana],
FetchOptions == Int {
}
class FruitStore {
var bananaService: BananaService
// ... more fruity code for our steamy company ...
}
预期:Swift意识到BananaService不需要任何其他通用参数,并允许开发人员使用该类型进行变量定义。
经验丰富:var bananaService: BananaService
的定义出错。
❌Protocol 'BananaService' can only be used as a generic constraint because it has Self or associated type requirements
答案 0 :(得分:0)
当您在协议(associatedtype
)中使用泛型类型时,您不能将协议用作参考,您需要使class
从协议中继承并设置typealias
associatedtype
。
示例:
protocol BananaServiceProtocol: class, GenericFetching {
}
class BananaService: BananaServiceProtocol {
typealias FetchEntity = [Banana]
typealias FetchOptions = Int
}
class FruitStore {
var bananaService: BananaService
// ... more fruity code for our steamy company ...
}