xcode - example - swift delegate pass data



Quando avviare un delegato in Swift (1)

Ho una domanda di base. Sto lavorando a un progetto con molti pattern delegati e vorrei avere riferimenti sul modo migliore per inizializzarli ..

Ecco alcune idee con un delegato di test che ho fatto:

Opzione 1:

Fallisce perché sto iniziando il delegato a self prima di 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
    }
}

Opzione 2:

Funziona, ma poi rischio che il delegato sia zero .. Dovrei eseguire un controllo "if delegate! = Nil" ogni volta che voglio chiamare un metodo? C'è un modo per aggirare questo? È una buona pratica avviare il delegato in questo modo?

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
    }
}

Quelle erano solo un paio di idee. Sto solo cercando di imparare il modo migliore per farlo. Sono aperto a tutti i suggerimenti.

Grazie!!


L'opzione 2 sembra migliore. Tuttavia, in questo caso sarebbe consigliabile utilizzare un opzionale come tipo di delegato. In questo modo, non è necessario selezionare "if delegate! = Nil" ogni volta che si desidera eseguire un'attività con esso. Puoi semplicemente utilizzare il concatenamento opzionale, progettato specificamente per questi casi in cui desideri eseguire un'attività su un opzionale solo se contiene un valore.

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
    }
}




swift2