swift - 如何解决 Swift 协议(protocol)的规范问题

标签 swift generics swift-protocols

protocol Specification {
    associatedtype T
    func isSatisfied(item : T) -> Bool
}

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

上述代码给出了以下错误

Protocol 'Specification' can only be used as a generic constraint because it has Self or associated type requirements

我理解是关联类型有这个问题,加个where子句就可以解决。但是我不知道应该在哪里以及如何使用这个 where 子句

最佳答案

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

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

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

关于swift - 如何解决 Swift 协议(protocol)的规范问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58871872/

相关文章:

ios - Swift:使用协议(protocol)进行典型化?

ios - Swift 面向协议(protocol)的扩展

json - 如何快速获取特定的json值

c# - 在 C# 中使用泛型以避免代码重复

c# - 如何从 C# 中的封闭构造类中获取基类对象

swift - 在 swift 3 中使用 UIViewControllerAnimatedTransitioning 时遇到问题

ios - Google AutoComplete API 地址组件

ios - 如何在 Swift iOS 应用程序中添加 Google Drive API?

ios - 将图像上传到 firebase 时 Swift 应用程序崩溃

c# - 展平 IEnumerable<IEnumerable<>>;理解泛型