【发布时间】:2018-12-04 17:24:09
【问题描述】:
class Human {
var name : String?
}
class Man : Human {
var numberOfWallets : Int?
}
class Woman : Human {
var numberOfPurses : Int?
}
protocol P {
associatedtype Person : Human
func printX(of person : Person)
func printY(of person: Person)
}
这允许Human 成为它的typealias:
class C : P {
typealias Person = Human
func printX(of person: Human) {
print(person.numberOfCars)
}
func printY(of person: Human) {
print(person.name)
}
}
如您所见,Person 类型受Human 约束,Human 本身就是一个具体类型。我想知道这是否普遍。我的直觉告诉我,这实际上表明我不应该使用协议,而类本身就很好。
或者我应该这样做
protocol P {
associatedtype Person
func printX(of person : Person)
func printY(of person: Person)
}
class C : P {
func printX(of person: Man) {
print(person.numberOfCars)
}
func printY(of person: Man) {
print(person.name)
}
}
这不允许Woman 和Man 实例同时用于C 实例。
我知道这取决于我想做什么。但我的问题真的是:用具体类型约束关联类型有意义吗?!
或相关类型只是不受协议约束或受协议约束,而不是具体类型...
【问题讨论】:
-
它们可能不像协议约束的关联类型那样常见,但类约束的关联类型肯定有有效的用例,就像类约束的泛型占位符有有效的用例一样。
-
所以回答我自己的问题:这样做很好。我认为这可能不好的原因是因为我是使用 PAT 的新手,而且大多数 Swift 文档都被限制在另一个协议中。即我没有遇到受具体类型约束的关联类型......
标签: swift protocols swift-protocols design-principles associated-types