【发布时间】:2023-03-19 09:37:01
【问题描述】:
我正在尝试在 Swift 3 中创建一个类来实现 Cordova 插件。我有这个构建和运行,但是只要访问该类的任何属性,应用程序就会崩溃。我尝试了两种初始化类的方法:
@objc(DSFMediaCentre)
class DSFMediaCentre : CDVPlugin
{
var players = [UUID:DSFPlayerHandler] ();
...
}
和
@objc(DSFMediaCentre)
class DSFMediaCentre : CDVPlugin
{
var players :[UUID:DSFPlayerHandler];
override init () {
players = [:];
}
...
}
但是,当使用我的players 属性时,结果是一个 EXC_BAD_ACCESS 异常,其地址看起来像一个空指针取消引用。
对象是由 Objective C 代码创建的,这是一种我完全不熟悉的语言,但我认为这是创建它的行:
obj = [[NSClassFromString(className)alloc] initWithWebViewEngine:_webViewEngine];
CDVPlugin 类包含一条注释,指出不应重写 initWithWebViewEngine(实际上我似乎无法能够重写此方法,因为虽然它在 @ 中声明987654327@ 文件,CDVPlugin.h 中没有提到它,所以 Swift 编译器似乎不知道它),而是应该将初始化代码放在一个名为 pluginInitialize 的方法中。但是,如果这样做,我会收到编译器错误(“Class DSFMediaCentre 没有初始化程序”)。
此外,如果我将 init() 方法放回原处并将其设置为调用 pluginInitialize(),如下所示:
override init () {
super.init(); // necessary otherwise next line is an error
pluginInitialize();
}
override func pluginInitialize() {
players = [:];
}
然后错误变为“属性 'self.players' 未在 super.init 调用时初始化”。
如何让这个类正确初始化?
【问题讨论】:
-
也许您使用的是 Swift 4,并且需要在从 Objective-C 访问的 class + ivars 前加上 @objc?
-
不,我正在使用 swift 3。将其添加到问题中;还没看过swift 4呢。
标签: objective-c swift cordova swift3