Swift 4 iOS:初始化器因‘internal’保护级别无法访问求助
解决Swift中“initializer is inaccessible due to 'internal' protection level”错误
嘿,我来帮你搞定这个问题!你虽然已经给TappyBleScanner加了public init(),但还有个隐藏的坑没踩对——就是你那个manager属性的初始化方式出了问题。
问题根源
你在类里直接这样声明并初始化manager:
public var manager : CBCentralManager = CBCentralManager(delegate: self, queue : nil)
这里有两个关键问题:
- 属性在类实例完全初始化前就被赋值,此时
self还没准备好,这种写法本身就存在安全风险(Xcode大概率还会给你弹出警告); - 更核心的是,Swift中当你在属性定义时直接赋值,这个初始化逻辑会依赖类的默认初始化流程,而默认初始化器的访问级别是
internal。哪怕你加了public init(),整个初始化链条里还是有internal的环节,导致外部无法正常调用。
解决方案
把manager的初始化移到init()方法里,并且先调用父类的初始化方法(因为继承自NSObject),具体修改如下:
public class TappyBleScanner : NSObject, CBCentralManagerDelegate { // 先声明为隐式解包可选,延迟初始化 public var manager: CBCentralManager! public override init() { super.init() // 必须先调用父类初始化,确保self可用 manager = CBCentralManager(delegate: self, queue: nil) } }
为什么这样有效?
- 把
manager的初始化放到init()里,确保self已经完成了父类的初始化,此时传递self作为代理是完全安全的; - 整个初始化流程完全由你显式的
public override init()控制,没有了internal的默认初始化环节,外部的ViewController就能正常实例化这个类了。
修改后,你ViewController里的var tappyScanner : TappyBleScanner = TappyBleScanner()就不会再报错啦!
内容的提问来源于stack exchange,提问作者Papyrus
相关产品推荐
相关产品推荐

