我发现了很多关于该NSArray element failed to match the Swift Array Element type
错误的帖子。但是,我仍然无法让它工作。我怀疑这个问题与我所做的目标 C 框架绑定有关,而不是铸造问题。除其他外,我不明白的一件事是为什么代码在 lldbp
指令中工作,而不是作为在主机 ios 应用程序中执行的单元测试(否则我无法测试它,因为代码需要 B-LE 无法从iphone模拟器)。
class onceFirstMuseConnected: IXNMuseListener {
let museManager: IXNMuseManager
let callback: (_ muse: IXNMuse) -> Void
init(museManager: IXNMuseManager, callback: @escaping (_ muse: IXNMuse) -> Void) {
self.museManager = museManager
self.callback = callback
museManager.setMuseListener(self)
museManager.startListening()
}
func museListChanged() {
let muses: [IXNMuse] = museManager.getMuses()
guard muses.count > 0 else {
return
}
let _ = muses.first!.getName() // <<<< `muses.first` fails as well as any other
// kind of array's item access with "Fatal
// error: NSArray element failed to match the
// Swift Array Element type"
}
}
奇怪的是我能够使该行在 lldb 中工作,如下图所示。
编辑:由于我有多次反对票,我希望能解释一下为什么 lldb 行在主执行崩溃时在评论中起作用。如果是类型转换问题,我认为 lldb 行将不起作用。我发现的相关问题都没有回答这个问题。我承认我是一个 swift/objc 新手,如果这不是与 objc-swift 框架映射过程相关的问题,可能有一些我不明白的事情。
该getMuses
函数由 djinni 使用我编写的模块映射包装,用于将专有的目标 C 框架绑定到 swift。这是我写的模块图。我对其他函数绑定没有任何问题(见评论)。删除该[system]
属性不会触发任何其他警告。
module Muse [system] {
header "Muse.framework/Headers/Muse.h"
export *
}
djinni 生成的声明:
public func getMuses() -> [IXNMuse]
原始的 objc 声明:
- (nonnull NSArray<IXNMuse *> *)getMuses;
该定义不可用,因为该框架是专有的。
返回的指针不太可能为 null 或指出错误的内存地址,因为 lldb 对屏幕截图中显示的 getName 方法的调用不会给出正确的结果。