Objective-C类中来自Swift Package的属性在Swift子类中不可见
类层级:MySwiftSubViewController -> ViewController -> UIViewController
Objective-C父类声明
#import <UIKit/UIKit.h> @class SwiftClassFromPackage; @interface ViewController : UIViewController @property (nonatomic, strong) SwiftClassFromPackage* _Nullable someSwiftObjectFromPackage; @end
Objective-C父类实现(内部使用正常)
#import "ViewController.h" @import MyPackage; @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _someSwiftObjectFromPackage = [[SwiftClassFromPackage alloc] init]; } @end
Swift子类编译错误
import UIKit import MyPackage class MySwiftSubViewController: ViewController { override func viewDidLoad() { super.viewDidLoad() print("\(self.someSwiftObjectFromPackage.text)") // 编译错误:Value of type 'MySwiftSubViewController' has no member 'someSwiftObjectFromPackage' } }
单独在包外使用SwiftClassFromPackage类正常,但作为Objective-C类的属性在Swift子类中无法访问,请问原因是什么?
核心原因
Objective-C头文件里只用@class SwiftClassFromPackage做了前向声明,没导入该类的正式头文件,导致Swift和Objective-C的桥接器没法识别这个类型,自然不会把该属性暴露给Swift子类。
解决步骤
替换前向声明为正式导入
修改ViewController.h,把@class SwiftClassFromPackage换成Swift包的导入语句:#import <UIKit/UIKit.h> // 替换前向声明为包导入 #import <MyPackage/SwiftClassFromPackage.h> @interface ViewController : UIViewController @property (nonatomic, strong) SwiftClassFromPackage* _Nullable someSwiftObjectFromPackage; @end要是Swift包生成的是统一伞头,也可以用
@import MyPackage;代替具体类的导入。确认Swift类支持Objective-C桥接
检查Swift包中的SwiftClassFromPackage类是否加了@objc修饰符,且继承自NSObject(或者在Package.swift里确认objcInteropEnabled = true,默认是开启的):@objc public class SwiftClassFromPackage: NSObject { public var text: String = "Hello" @objc public override init() { super.init() } }只有继承自
NSObject且符合Objective-C桥接要求的Swift类,才能被Objective-C正确识别,进而让Swift子类访问到对应的属性。
补充说明
前向声明只能让Objective-C代码编译通过,但没法提供完整的类型信息。Swift桥接器需要完整的类型定义才能生成对应的Swift接口,当Objective-C头文件只有前向声明时,Swift会把该属性当成UnsafeMutableRawPointer?类型,而非实际的SwiftClassFromPackage?,所以用.语法访问成员属性会报错。
内容的提问来源于stack exchange,提问作者iljer

