错误是正确的。你必须让你的类最终,因为没有子类可以符合你的协议Ownee
.
考虑这个子类:
class FirstGradeStudent: Student {
// Student contains following variable:
// var owner: Owner<Student> {
// return professor
// }
}
正如你所看到的,它必须实施var owner: Owner<Student>
因为他的父母,但应该实施var owner: Owner<FirstGradeStudent>
相反,因为协议包含var owner: Owner<Self> { get }
在这种情况下Self
将会FirstGradeStudent
.
解决方法
1:定义一个超类Ownee
,它应该被使用Owner
:
class Owner<T: OwneeSuper> {
// ...
}
protocol OwneeSuper {}
protocol Ownee: OwneeSuper {
associatedtype T: OwneeSuper
var owner: Owner<T> { get }
}
OwneeSuper
只是一个解决方法来克服这个问题 https://forums.developer.apple.com/thread/13657,否则我们只会使用:
protocol Ownee {
associatedtype T: Ownee
var owner: Owner<T> { get }
}
2.在符合以下条件的班级中Ownee
,你必须将抽象类型associatedtype
通过定义一个具体的类typealias
:
class Student: Ownee {
typealias T = Student // <<-- define the property to be Owner<Student>
let professor: Professor
var owner: Owner<T> {
return professor
}
init(professor: Professor) {
self.professor = professor
}
}
3.子类现在可以使用该属性,该属性将是您定义的类型:
class FirstGradeStudent: Student {
func checkOwnerType() {
if self.owner is Owner<Student> { //warning: 'is' test is always true
print("yeah!")
}
}
}