如何解决Swift协议的规范问题


protocol Specification {
associatedtype T
func isSatisfied(item : T) -> Bool
}
protocol AndSpecification {
associatedtype T
var arrayOfSpecs : [Specification] {set}
}

上述代码给出以下错误

协议"规范"只能用作通用约束因为它有自身或相关类型的要求

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

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

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

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

最新更新