【问题标题】:How to solve the specification problem for Swift Protocol如何解决 Swift 协议的规范问题
【发布时间】:2019-11-15 07:04:03
【问题描述】:
protocol Specification {
    associatedtype T
    func isSatisfied(item : T) -> Bool
}

protocol AndSpecification {
    associatedtype T
    var arrayOfSpecs : [Specification] {set}
}

上述代码给出以下错误

协议“规范”只能用作通用约束 因为它有 Self 或关联的类型要求

我知道是因为关联类型导致的这个问题,如果我添加一个where子句就可以解决这个问题。但是我不知道应该在哪里以及如何使用这个 where 子句

【问题讨论】:

    标签: swift generics swift-protocols


    【解决方案1】:

    您认为您需要一个where 子句,因为您希望数组包含Specifications 都具有相同的T,对吗?好吧,具有关联类型的协议也不能这样做!

    你可以做的是让数组包含所有相同类型的规范:

    protocol AndSpecification {
        associatedtype SpecificationType : Specification
        var arrayOfSpecs : [SpecificationType] { get }
    }
    

    如果你真的喜欢你的 T 关联类型,你仍然可以添加一个:

    protocol AndSpecification {
        associatedtype T
        associatedtype SpecificationType : Specification where SpecificationType.T == T
        var arrayOfSpecs : [SpecificationType] { get }
    }
    

    但这很多余,因为你可以直接说AndSpecification.SpecificationType.T

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多