何时在Swift中初始化委托

Joe*_*yLD 10 xcode cocoa delegates swift2

我有一个基本问题.我正在开发一个具有许多委托模式的项目,并希望参考有关初始化它们的最佳方法.

以下是我制作的测试代表的一些想法:

选项1:

它失败了因为我在super.init()之前启动了委托给自己

protocol MyClassDelegate {
    func doSomething()
}

class MyClass {

    var delegate: MyClassDelegate!

    init(delegate: MyClassDelegate){
        self.delegate = delegate
    }

    func myClassFuction(){
        self.delegate.doSomething()
    }
}


class ClassConformingToDelegate: NSObject, MyClassDelegate {

    let myClass: MyClass

    override init(){
        myClass = MyClass(delegate: self) // Error because it's called before super.init
        super.init()
    }        

    func doSomething(){
        //called from the delegate
    }
}
Run Code Online (Sandbox Code Playgroud)

选项2:

它的工作原理,但是我冒着让委托成为nil的风险.每次我想调用一个方法时,我是否必须运行'if delegate!= nil'检查?有办法吗?以这种方式初始化委托是一个好习惯吗?

protocol MyClassDelegate {
    func doSomething()
}

class MyClass {

    var delegate: MyClassDelegate!

    init(){
    }

    func myClassFuction(){
        self.delegate.doSomething() // might fail if delegate is nil
    }
}


class ClassConformingToDelegate: NSObject, MyClassDelegate {

    let myClass: MyClass

    override init(){
        myClass = MyClass()
        super.init()
        myClass.delegate = self // works because called after super.init
    }        

    func doSomething(){
        //called from the delegate
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是一些想法.我只是想学习最好的方法.我对所有建议持开放态度.

谢谢!!

小智 5

选项 2 看起来更好。但是,在这种情况下,建议使用 optional 作为您的委托类型。这样,每次要使用它执行任务时,您都不需要检查“if delegate != nil”。您可以简单地使用可选链,它是专门为这样的情况设计的,即您希望仅当它包含一个值时才对它执行任务。

protocol MyClassDelegate {
    func doSomething()
}

class MyClass {

    var delegate: MyClassDelegate?

    init(){
    }

    func myClassFuction(){
        self.delegate?.doSomething() // will do nothing if delegate is nil
    }
}


class ClassConformingToDelegate: NSObject, MyClassDelegate {

    let myClass: MyClass

    override init(){
        myClass = MyClass()
        super.init()
        myClass.delegate = self
    }        

    func doSomething(){
        //called from the delegate
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么选项 2 更好?@vinn (5认同)
  • 但是,如果到目前为止在代码中每次使用“MyClass”时都立即设置其委托,那么您可能会将其包含在“MyClass”初始值设定项中,这样您就永远不会忘记设置它并获得意外的行为。如果您后来决定要在没有委托的情况下使用“MyClass”,那么此时继续将其从初始化程序中删除,但至少这会让您考虑您正在做什么并思考为什么要这样做那样。从限制性开始,只有在必要且有充分理由时才允许限制性较小的行为。 (2认同)