协议变量的循环引用

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?