2017-02-24 59 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

感謝另一種選擇 –