专用通用协议只能用作通用约束

时间:2019-07-22 10:58:30

标签: swift generics protocols

创建了一个通用协议,并创建了一个专用协议,它解析了所有通用参数。 尝试将专用协议用作变量类型时,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

1 个答案:

答案 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 ...
}