2017-11-27 2 views
0

Ich habe eine Klasse implementiert MultipeerConnectivity und ich möchte eine Unterklasse für Werbetreibende implementieren. Hier ist, was Ich mag würde:Initialisierungsphasen - kann dies einfacher durchgeführt werden?

class ConnectionManager: NSObject { 

    let serviceType: String 
    let peerID: MCPeerID 
    let session: MCSession 
    var delegate: ViewController! 

    override init() { 
    serviceType = "mc-service" 
    peerID = MCPeerID(displayName: UIDevice.current.name) 
    session = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .required) 
    super.init() 
    session.delegate = self 
    } 
} 

class AdvertiserConnectionManager: ConnectionManager { 

    let assistant: MCAdvertiserAssistant 

    override init() { 
    assistant = MCAdvertiserAssistant(serviceType: serviceType, discoveryInfo: nil, session: session) 
    super.init() 
    assistant.delegate = self 
    assistant.start() 
    } 
} 

aber bricht die Phasing Regeln für init(), weil MCAdvertiserAssistant (service :, discoveryInfo :, Sitzung :) verwendet service und Sitzung, beide Eigenschaften der Oberklasse.

Ich habe das folgende mit der Unterklasse statt, Betrug, indem Sie Assistenten faulenzen. Das funktioniert! Warum? Der Initialisierer muss immer noch self aufrufen !!! Und ich musste diese unnatürliche Sache tun, um meine Unterklasse zu erstellen. Und ich habe wahrscheinlich unterlaufen was phasing sollte vermeiden !!

class AdvertiserConnectionManager: ConnectionManager { 

    lazy var assistant: MCAdvertiserAssistant = { 
    MCAdvertiserAssistant(serviceType: serviceType, discoveryInfo: nil, session: session) 
    }() 

    override init() { 
    super.init() 
    assistant.delegate = self 
    assistant.start() 
    } 
} 

Antwort

1

Sie sind nicht Betrug und dies ist kein unnatürliche Sache. Dies ist eine übliche Art, Eigenschaften eines Objekts zu initialisieren, die voneinander abhängen.

Vom documentation (Swift Language Guide: Properties):

A faul gespeichert Eigenschaft ist eine Eigenschaft, dessen Anfangswert nicht bis zum ersten Mal berechnet sie verwendet wird.
...
Lazy-Eigenschaften sind hilfreich, wenn der Anfangswert für eine Eigenschaft von externen Faktoren abhängt, deren Werte erst nach Abschluss der Initialisierung einer Instanz bekannt sind.

In Ihrem Fall assistant wird nach der super.init Anruf bei self, gültig und verfügbar serviceTime und session sind initialisiert werden.

Verwandte Themen