You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

初始化方法用CBPeripheralManagerDelegate时遇'self'在super.init前调用错误

解决Swift中'self' used before 'super.init'错误问题

问题原因

Swift初始化规则有明确要求:

  • 子类必须先完成自身所有存储属性的初始化,才能调用父类的super.init()
  • 在super.init()执行完成前,self并未完全初始化,不能将其作为参数传递给其他方法或对象(比如这里的CBPeripheralManager delegate参数)

你的代码里,在初始化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)
    }
}

修正逻辑说明

  1. 先初始化必选属性:deviceConnectedMethodChannel没有默认值,属于必选存储属性,必须在super.init()之前完成赋值。
  2. 调用父类初始化:继承自NSObject的类,自定义初始化方法中必须显式调用super.init(),确保父类部分完成初始化。
  3. 最后初始化peripheralManager:此时self已经是完全初始化的实例,可以安全地作为CBPeripheralManager的delegate参数使用。

内容的提问来源于stack exchange,提问作者smartsanja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:42:15