2017-11-27 15 views
0

私はMultipeerConnectivityを実装するクラスを持っていて、サブクラスがそれを広告主に実装したいと思っています。 MCAdvertiserAssistant(サービス種別:, discoveryInfo :,セッション:)は、両方の性質をのServiceTypeセッションを使用しているため)(初期化段階 - これはより簡単に行うことができますか?

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

をこれは、initのための位相ルールを破る:ここで私が欲しいものですスーパークラスの

私はサブクラスで次のようにしました。助手を遅延して宣言して不正行為をしました。これは動作します!どうして?イニシャライザは依然として自己を呼び出す必要があります。私のサブクラスを作成するには、この不自然なことをしなければなりませんでした。そして、私はおそらくフェイズが避けようとしていたものを転覆しました!

class AdvertiserConnectionManager: ConnectionManager { 

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

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

答えて

1

あなたは不正行為ではありません、これは不自然なものではありません。これは、お互いに依存するオブジェクトのプロパティを初期化する通常の方法です。 documentation (Swift Language Guide: Properties)から

遅延記憶されプロパティは、その初期値が使用されている最初の時間まで計算されない特性です。
...
遅延プロパティは、プロパティの初期値が、インスタンスの初期化が完了するまで値がわからない外部ファクタに依存する場合に便利です。あなたのケースでは

selfserviceTimesessionが有効かつ利用可能な場合assistantsuper.initコールを初期化されます。

関連する問題