2017-02-24 32 views
2

我点名MQTTController与共享实例和私人init方法如何在init函数中将委托设置为self?

class MQTTController:NSObject, CocoaMQTTDelegate { 
     static let sharedInstance = MQTTController() 
     var clientID:String 
     var mqtt:CocoaMQTT 
     private override init() { 
     clientID = "xyz-" + String(ProcessInfo().processIdentifier) 
     mqtt = CocoaMQTT(clientID: clientID, host: "mqttcontroller.mqtt.net", port: 1883) 
     mqtt.username = "myusername" 
     mqtt.password = "mypassword" 
     mqtt.willMessage = CocoaMQTTWill(topic: "/will", message: "dieout") 
     mqtt.keepAlive = 30 
     mqtt.cleanSession = true 
     MQTTController.isConnecting = true 
     mqtt.delegate = self //Error at this Line "'self' used before super.init call" 
     mqtt.connect() 
    } 
} 

在这里,我知道,我可以创造另一种方法来设置委托,并调用mqtt.connect()只是想知道类是存在的,我不要任何解决方案不必创建并调用另一种方法。

回答

3

错误消息告诉你需要做什么,你需要在init中调用super.init()。

class MQTTController:NSObject, CocoaMQTTDelegate { 
    static let sharedInstance = MQTTController() 
    var clientID:String 
    var mqtt:CocoaMQTT 
    private override init() { 
     clientID = "xyz-" + String(ProcessInfo().processIdentifier) 
     mqtt = CocoaMQTT(clientID: clientID, host: "mqttcontroller.mqtt.net", port: 1883) 
     mqtt.username = "myusername" 
     mqtt.password = "mypassword" 
     mqtt.willMessage = CocoaMQTTWill(topic: "/will", message: "dieout") 
     mqtt.keepAlive = 30 
     mqtt.cleanSession = true 
     MQTTController.isConnecting = true 

     super.init() // This line was missing 

     mqtt.delegate = self 
     mqtt.connect() 
    } 
} 
1

你也应该能够使用defer,但与super.init()答案去

class MQTTController:NSObject, CocoaMQTTDelegate { 
    static let sharedInstance = MQTTController() 
    var clientID:String 
    var mqtt:CocoaMQTT 
    private override init() { 
     clientID = "xyz-" + String(ProcessInfo().processIdentifier) 
     mqtt = CocoaMQTT(clientID: clientID, host: "mqttcontroller.mqtt.net", port: 1883) 
     mqtt.username = "myusername" 
     mqtt.password = "mypassword" 
     mqtt.willMessage = CocoaMQTTWill(topic: "/will", message: "dieout") 
     mqtt.keepAlive = 30 
     mqtt.cleanSession = true 
     MQTTController.isConnecting = true 

     defer { 
      mqtt.delegate = self 
      mqtt.connect() 
     } 
    } 
} 
+0

感谢另一种选择 –

相关问题