如何在Swift中初始化对象期间将self传递给初始化程序?

Ana*_*Ana 11 ios core-bluetooth swift

我有以下代码:

import CoreBluetooth

class BrowserSample: NSObject, CBCentralManagerDelegate {
    let central : CBCentralManager

    init() {
        central = CBCentralManager(delegate: self, queue: nil, options: nil)
        super.init()
    }

    func centralManagerDidUpdateState(central: CBCentralManager!)  { }
}
Run Code Online (Sandbox Code Playgroud)

如果我central =之前把线放super.init(),那我得到错误:

self used before super.init() call
Run Code Online (Sandbox Code Playgroud)

如果我把它放在后面,我得到错误:

Property self.central not initialized at super.init call
Run Code Online (Sandbox Code Playgroud)

所以,我很困惑.我该怎么做呢?

Bry*_*hen 20

一种解决方法是使用ImplicitlyUnwrappedOptional这样central与初始化nil第一

class BrowserSample: NSObject, CBCentralManagerDelegate {
    var central : CBCentralManager!

    init() {
        super.init()
        central = CBCentralManager(delegate: self, queue: nil, options: nil)
    }

    func centralManagerDidUpdateState(central: CBCentralManager!)  { }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以试试 @lazy

class BrowserSample: NSObject, CBCentralManagerDelegate {
    @lazy var central : CBCentralManager = CBCentralManager(delegate: self, queue: nil, options: nil)

    init() {
        super.init()
    }

    func centralManagerDidUpdateState(central: CBCentralManager!)  { }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢@lazy.好 (2认同)
  • 在某些情况下,使用CBCentralManager懒惰是个坏主意,因为初始化蓝牙无线电需要一些时间 (2认同)