协议变量的循环引用

时间:2015-01-04 01:22:31

标签: swift

在这个例子中形成循环引用,但是我不能对协议变量应用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...")
    }
}

2 个答案:

答案 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?