在这个例子中形成循环引用,但是我不能对协议变量应用unowned或weak,这种情况下的解决方法是什么。
protocol Report {
func done()
}
class Employee {
unowned var report: Report? //error here with using unowned or weak
func whenIAmDone() {
report.done()
}
}
class Supervisor: Report {
var employees: [Employee]?
init() {
for i in 1...5 {
var employee = Employee()
employee.report = self
employees?.append(employee)
}
}
func done() {
println("work done by...")
}
}
答案 0 :(得分:1)
您需要将Report
协议声明为仅限课程,方法是在其声明中添加class
:
protocol Report: class {
func done()
}
你在那里有一个单独的问题,你选择的"弱"之间存在分歧。关键字和report
属性是可选的。以下是规则:weak
实例始终是可选的,unowned
实例永远不是可选的。 Employee
应如下所示:
class Employee {
weak var report: Report? //error here with using unowned or weak
func whenIAmDone() {
report?.done()
}
}
或者如果你想让report
无主,那么它需要是一个非可选的,但是你需要一个可以给它一个值的初始化器。
答案 1 :(得分:0)
您必须将您的协议声明为仅限类别,如下所示。
protocol Report : class {
func done()
}
class Employee {
weak var report: Report?
func whenIAmDone() {
report?.done()
}
}
阅读本文以了解弱者与无人之间的区别。 What is the difference between a weak reference and an unowned reference?