初始化方法用CBPeripheralManagerDelegate时遇'self'在super.init前调用错误
解决Swift中'self' used before 'super.init'错误问题
问题原因
Swift初始化规则有明确要求:
- 子类必须先完成自身所有存储属性的初始化,才能调用父类的
super.init() - 在
super.init()执行完成前,self并未完全初始化,不能将其作为参数传递给其他方法或对象(比如这里的CBPeripheralManagerdelegate参数)
你的代码里,在初始化deviceConnectedMethodChannel(必选存储属性)和调用super.init()之前,就把self传给了CBPeripheralManager的构造方法,违反了这个规则,因此触发错误。
修正代码
import CoreBluetooth @objc public class L2CapChannelManager : NSObject, CBPeripheralManagerDelegate { private var peripheralManager: CBPeripheralManager? private var deviceConnectedMethodChannel: FlutterMethodChannel @objc public init(deviceConnectedMethodChannel: FlutterMethodChannel) { // 1. 先初始化所有必选存储属性 self.deviceConnectedMethodChannel = deviceConnectedMethodChannel // 2. 调用父类初始化方法,完成对象基础初始化 super.init() // 3. 此时self已完全初始化,可安全用作delegate self.peripheralManager = CBPeripheralManager(delegate: self, queue: nil) } }
修正逻辑说明
- 先初始化必选属性:
deviceConnectedMethodChannel没有默认值,属于必选存储属性,必须在super.init()之前完成赋值。 - 调用父类初始化:继承自
NSObject的类,自定义初始化方法中必须显式调用super.init(),确保父类部分完成初始化。 - 最后初始化peripheralManager:此时
self已经是完全初始化的实例,可以安全地作为CBPeripheralManager的delegate参数使用。
内容的提问来源于stack exchange,提问作者smartsanja
相关产品推荐
相关产品推荐

