【问题标题】:How to set delegate to self inside init function?如何在 init 函数中将委托设置为 self?
【发布时间】:2017-02-24 07:26:08
【问题描述】:

我有一个名为 MQTTController 的类,它带有共享实例和私有 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
        mqtt.delegate = self    //Error at this Line "'self' used before super.init call"
        mqtt.connect()
    } 
}

在这里,我知道我可以创建另一个方法来设置委托并调用mqtt.connect(),但我只想知道是否有任何解决方案,我不必创建和调用另一个方法。

【问题讨论】:

    标签: ios swift delegates singleton mqtt


    【解决方案1】:

    错误信息告诉你需要做什么,你需要在你的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()
        } 
    }
    

    【讨论】:

      【解决方案2】:

      您也应该能够使用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()
              }
          } 
      }
      

      【讨论】:

      • 感谢您的其他选择
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多