我有一个实现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()
}
}
答案 0 :(得分:1)
你不是作弊,这不是不自然的事情。这是初始化彼此依赖的对象属性的常用方法。
来自documentation (Swift Language Guide: Properties):
lazy stored 属性是一个属性,其初始值在第一次使用之前不会计算。
...
当属性的初始值依赖于外部因素时,延迟属性非常有用,这些因素的值在实例初始化完成之后才知道。
如果assistant
,super.init
和self
有效且serviceTime
来电,则session
会在<div> ... </div>
来电后<{>}初始化return ++$maxContratNum;
可用。