【发布时间】:2017-11-27 16:16:56
【问题描述】:
我有一个实现 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 , 超类的两个属性。
我已经对子类做了以下操作,通过懒惰地声明 assistant 来作弊。这行得通!为什么?初始化器仍然需要调用self!!!我不得不做这种不自然的事情来创建我的子类。而且我可能已经颠覆了要避免的分阶段!
class AdvertiserConnectionManager: ConnectionManager {
lazy var assistant: MCAdvertiserAssistant = {
MCAdvertiserAssistant(serviceType: serviceType, discoveryInfo: nil, session: session)
}()
override init() {
super.init()
assistant.delegate = self
assistant.start()
}
}
【问题讨论】: