【发布时间】:2019-01-05 05:34:21
【问题描述】:
我们有一个 Objective C 库,可以创建用于 Swift 代码的对象。
该函数将对象作为 id 返回。这是 Objective C 头文件 (Clazz.h) 中的声明。头文件已根据互操作性的要求在桥接头中公开。
+ (id)getObject;
返回的指针是 AVAssetWriter* 的一个实例。要在 Swift 中访问此 API,我按照以下帖子中的步骤操作: Objective-C pointer and swift
这是 Swift 3 代码消费者代码:
let obj = (Clazz.getObject() as! UnsafeMutableRawPointer).assumingMemoryBoundTo(to: AVAssetWriter.self).pointee
它构建得很好。但是,执行此代码时,应用程序似乎崩溃了。
在 Clazz.h 中,我将函数声明为:
+ (AVAssetWriter*)getObject();
并尝试在 Swift 中使用它,
let obj = Clazz.getObject() as AVAssetWriter
代码构建良好,但执行时失败。
我们如何在 Swift 中访问 Objective C 创建的对象?
请注意,我能够检查 swift 代码中的值,问题不在于桥接。此外,内存位置没有悬空。
【问题讨论】:
-
显而易见的答案是重写Objective C 声明,使其返回实际类型而不是
id。你说as AVAssetWriter在运行时失败了。发生了什么?它是如何失败的? -
对不起......它没有在那里失败。类型转换有效,但在检查它时,它显示了一个长值和 ObjectiveC.NSObject 而不是 AVAssetWriter。当我尝试将它用作 AVAssetWriter 并访问它的一个属性时它失败了。
-
那么当您尝试访问该属性时,那个错误是什么?
-
我发现了这个问题...作为一个 java 开发人员,我习惯于用变量名来声明类型,以至于我忘了提到 obj 作为 AVAssetWriter 类型。谢谢!
-
我不确定。也许问另一个问题,显示您的代码和编译器的确切消息
标签: ios objective-c swift3 interop