【问题标题】: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。