2014-06-26 11 views
8

Mam następujący kod:Jak przekazywać dane do inicjatora podczas inicjalizacji obiektu w 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!) { } 
} 

Jeśli mogę umieścić linię central = przed super.init(), potem pojawia się błąd:

self used before super.init() call 

Jeśli mogę umieścić go później, pojawia się błąd:

Property self.central not initialized at super.init call 

Tak, jestem zdezorientowany. Jak mam to zrobic?

Odpowiedz

15

obejście jest użycie ImplicitlyUnwrappedOptional tak central jest inicjowany z nil pierwszy

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

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

    func centralManagerDidUpdateState(central: CBCentralManager!) { } 
} 

lub można spróbować @lazy

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

    init() { 
     super.init() 
    } 

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

Bardzo doceniam o @lazy. Dobry –

+0

Używanie leniwego z CBCentralManager jest złym pomysłem w niektórych sytuacjach, ponieważ inicjalizacja radia bluetooth trwa trochę dłużej – asdf

Powiązane problemy