Swift class 实例上的协议从不触发

Swift protocol on class instance never fires

我有一个 swift 协议,但它从未触发。

我有1个class是一个实例,另一个是class我想管理一个对象;

protocol TurnDelegate: class {
    func turnIsCompleted()
}

class ClassOne : NSObject {

    weak var delegate: TurnDelegate?

    override init() {
        super.init()
        delegate?.turnIsCompleted()
    }

}

class ClassTwo: NSObject, TurnDelegate {

    static var instance = ClassTwo()

    func turnIsCompleted() {
        print ("Turn is completed")
    }

}

let c2:ClassTwo = ClassTwo.instance
let c1:ClassOne = ClassOne.init()

我的问题是协议从不触发并且不输出 "turn is completed"

我该如何解决这个问题?

编辑:如何设置委托?

非常感谢

如果您描述了创建自定义 init

class ClassOne : NSObject {

    weak var delegate: TurnDelegate?

    init(with delegate: TurnDelegate?) {
        self.delegate = delegate
        delegate?.turnIsCompleted()
    }

}

比:

let c2:ClassTwo = ClassTwo.instance
let c1:ClassOne = ClassOne.init(with: c2)

输出:

Turn is completed

代表在他们所有的荣耀中确实也有他们的缺点。其中之一是必须显式建立对象及其委托之间的关系。在 Cocoa 中,通常有两种方法可以做到这一点。一种是在 InterfaceBuilder 中连接 delegate IBOutlet,另一种是以编程方式进行的。正如@OlegGordiichuck 指出的那样,您可以在初始化程序中执行此操作,但通常在 Cocoa 中,委托往往是属性。在您的情况下,这将归结为实例化 ClassTwoClassOne 的对象,然后手动将 c2 的委托设置为

c2.delegate = c1

然而,这会破坏您的通知机制,您必须有一个单独的方法来通知委托人(这又是典型的,因为通常您的委托人不知道是重要的其他人在其构建过程中。此外,发起者的构建通常不是代表必须知道的事情)。

您忘记设置委托。

通常在init 方法中设置委托。协议中的方法稍后在另一个方法中调用例如

protocol TurnDelegate: class {
    func turnIsCompleted()
}

class ClassOne : NSObject {

    weak var delegate: TurnDelegate?

    init(delegate: TurnDelegate?) {
       self.delegate = delegate
    }

    func turnSomething()
    {
        delegate?.turnIsCompleted()
    }

}

class ClassTwo: NSObject, TurnDelegate {

    static let instance = ClassTwo()

    func turnIsCompleted() {
        print ("Turn is completed")
    }

}

let c2 = ClassTwo.instance
let c1 = ClassOne(delegate: c2)
c1.turnSomething()

但是为此目的,尤其是与单例结合使用时,我更喜欢回调闭包而不是协议/委托。好处是开销更少,回调直接连接到调用方法。

class ClassOne : NSObject {

    func turnSomething()
    {
        let c2 = ClassTwo.instance
        c2.turn { 
            print ("Turn is completed")
        }
    }
}

class ClassTwo: NSObject {

    static let instance = ClassTwo()

    func turn(completion: ()->()) {
        // do heavy work
        completion()
    }

}

let c1 = ClassOne()
c1.turnSomething()