来自Singleton的Swift代表不工作

时间:2017-02-06 16:00:34

标签: ios swift

我试图在App类中实现SharedInstanceDelegate。我不知道为什么没有调用协议下的函数。

这是我的协议和课程。

class App {

    let sharedInstance = SharedInstance.shared

    init() {
        self.sharedInstance.delegate = self
    }
}

extension App: SharedInstanceDelegate {

    func1() { } // this is not executed
    func2() { }
}

protocol SharedInstanceDelegate: class {

   func1()
   func2()
}

class SharedInstance {

    static let shared = SharedInstance()
    weak var delegate: SharedInstanceDelegate?

    private init() { }

    func method1() {

        self.delegate?.func1() // this is executed
    }
}

4 个答案:

答案 0 :(得分:4)

我相信你的意思是让SharedInstanceDelegate成为一个协议,但你已经把它变成了一个类。在任何一种情况下,App都不符合/继承SharedInstanceDelegate,因此不清楚它是如何编译的。

答案 1 :(得分:1)

以下是我如何实现代码以使用委托:

class App {

    let sharedInstance = SharedInstance.shared

    init() {
        self.sharedInstance.delegate = self
    }
}

extension App: SharedInstanceDelegate {

    func func1() { } // this will run now
    func func2() { }
}

protocol SharedInstanceDelegate {
    func func1()
    func func2()
}

class SharedInstance {

    static let shared = SharedInstance()
    var delegate: SharedInstanceDelegate?

    private init() { }

    func method1() {

        self.delegate?.func1() // this is executed
    }
}

答案 2 :(得分:0)

仍然不知道为什么会这样,但清理项目修复了这个问题。这很奇怪。我有其他代表成功致电。

答案 3 :(得分:0)

您的代码可以正常工作,但这取决于您调用func1()的方式。这样称呼它:

let testinstance = App().sharedInstance
testinstance.delegate?.func1()

将无效,因为您没有持有App对象。在这种情况下,App对象是委托,但由于它是一个弱成员,没有人保留它,它会立即释放。

如果你这样称呼它:

let testapp = App()
testapp.sharedInstance.delegate?.func1()

它有效。在这种情况下,App对象被保留,并且在调用func1()时仍然存在。

无论哪种方式,这些类的相关方式让我感到困惑。为什么要有一个单独的SharedInstance类?