初始化阶段 - 这可以更容易地完成吗?

时间:2017-11-27 16:16:57

标签: swift lazy-initialization

我有一个实现MultipeerConnectivity的类,我想要一个子类来为广告商实现它。这是我想要的:

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()的阶段性规则,因为 MCAdvertiserAssistant(serviceType:,discoveryInfo:,session:)使用 serviceType session ,超类的两个属性。

我已经使用子类完成了以下操作,通过懒惰地声明助手来作弊。这有效!为什么?初始化者仍然需要调用 self !!!我不得不做这个不自然的事情来创建我的子类。我可能已经颠覆了阶段意图避免的事情!!

class AdvertiserConnectionManager: ConnectionManager {

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

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

1 个答案:

答案 0 :(得分:1)

你不是作弊,这不是不自然的事情。这是初始化彼此依赖的对象属性的常用方法。

来自documentation (Swift Language Guide: Properties)

  

lazy stored 属性是一个属性,其初始值在第一次使用之前不会计算。
  ...
  当属性的初始值依赖于外部因素时,延迟属性非常有用,这些因素的值在实例初始化完成之后才知道。

如果assistantsuper.initself有效且serviceTime来电,则session会在<div> ... </div>来电后<{>}初始化return ++$maxContratNum; 可用。