协议变量的循环引用
cyclic references for protocol variables
在此示例中形成了循环引用,但是我无法将 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...")
}
}
您需要通过在其声明中添加 class
来将您的 Report
协议声明为 class-only:
protocol Report: class {
func done()
}
你有一个单独的问题,你对 "weak" 关键字的选择与 report
属性 是可选的不一致。规则如下:weak
个实例始终是可选的,unowned
个实例永远不是可选的。 Employee
应该是这样的:
class Employee {
weak var report: Report? //error here with using unowned or weak
func whenIAmDone() {
report?.done()
}
}
或者如果您希望 report
是无主的,它需要是一个非可选的,但是您需要一个可以给它赋值的初始化器。
您必须将您的协议声明为 class-仅如下所示。
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?
在此示例中形成了循环引用,但是我无法将 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...")
}
}
您需要通过在其声明中添加 class
来将您的 Report
协议声明为 class-only:
protocol Report: class {
func done()
}
你有一个单独的问题,你对 "weak" 关键字的选择与 report
属性 是可选的不一致。规则如下:weak
个实例始终是可选的,unowned
个实例永远不是可选的。 Employee
应该是这样的:
class Employee {
weak var report: Report? //error here with using unowned or weak
func whenIAmDone() {
report?.done()
}
}
或者如果您希望 report
是无主的,它需要是一个非可选的,但是您需要一个可以给它赋值的初始化器。
您必须将您的协议声明为 class-仅如下所示。
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?