只能通过使用 Final 类来满足的 Swift 协议要求

2024-02-10

我正在 Swift 上建模所有者/所有者方案:

class Owner<T: Ownee> {
     // ...
}

protocol Ownee {
    var owner: Owner<Self> { get }
}

然后我有一对遵循上述建模类型的教授/学生:

class Professor: Owner<Student> {
    // ...
}

class Student: Ownee {
    let professor: Professor
    var owner: Owner<Student> {  // error here (see below)
        return professor
    }

    init(professor: Professor) {
        self.professor = professor
    }
}

但是我在定义时遇到以下错误var owner in the Student class:

协议“Ownee”要求“所有者”无法通过 非最终类(“Student”),因为它在非参数中使用“Self”, 非结果类型位置

我试图理解这个错误的原因是什么,为什么要上课StudentFinal 会修复它,并且如果有一些解决方法能够以不同的方式对此进行建模,而不会使此类成为最终类。我已经用谷歌搜索过这个错误,但到目前为止还没有发现太多。


错误是正确的。你必须让你的类最终,因为没有子类可以符合你的协议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!")
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

只能通过使用 Final 类来满足的 Swift 协议要求 的相关文章

随机推荐