2014-06-26 12 views
8

Ho il seguente codice:Come passare da auto a inizializzatore durante l'inizializzazione di un oggetto in Swift?

import CoreBluetooth 

class BrowserSample: NSObject, CBCentralManagerDelegate { 
    let central : CBCentralManager 

    init() { 
     central = CBCentralManager(delegate: self, queue: nil, options: nil) 
     super.init() 
    } 

    func centralManagerDidUpdateState(central: CBCentralManager!) { } 
} 

Se metto la linea central = prima super.init(), allora ottengo l'errore:

self used before super.init() call 

Se ho messo dopo, ottengo l'errore:

Property self.central not initialized at super.init call 

Quindi, sono confuso. Come faccio a fare questo?

risposta

15

una soluzione alternativa è l'uso ImplicitlyUnwrappedOptional così central viene inizializzato con nil prima

class BrowserSample: NSObject, CBCentralManagerDelegate { 
    var central : CBCentralManager! 

    init() { 
     super.init() 
     central = CBCentralManager(delegate: self, queue: nil, options: nil) 
    } 

    func centralManagerDidUpdateState(central: CBCentralManager!) { } 
} 

oppure si può provare @lazy

class BrowserSample: NSObject, CBCentralManagerDelegate { 
    @lazy var central : CBCentralManager = CBCentralManager(delegate: self, queue: nil, options: nil) 

    init() { 
     super.init() 
    } 

    func centralManagerDidUpdateState(central: CBCentralManager!) { } 
} 
+1

molto apprezzare su @lazy. Good –

+0

L'uso di Lazy con CBCentralManager è una cattiva idea in alcune situazioni perché richiede del tempo per far inizializzare la radio bluetooth – asdf

Problemi correlati