Objective-C定义的属性在同Target的Swift中不可见问题
解决Swift访问Objective-C类属性时的"has no member"编译错误
首先咱们来拆解下你遇到的问题:你在Swift类Baz里访问Objective-C的DataStore的controller属性时触发编译错误,本质是Swift类的@objc重命名和Objective-C里的类声明不匹配,导致桥接后的Swift代码无法识别这个属性。
问题根源分析
看你的代码细节就能找到症结:
- 在
Controller.swift里,你给Swift类加了@objc(NHController),这意味着这个类在Objective-C环境里的正式名字是NHController,而不是原本的Controller。 - 但在
DataStore.h和.m里,你依然用的是Controller作为类型声明,比如@class Controller;和@property (readonly, strong, nonatomic) Controller *controller;。
Objective-C这边的类声明和实际导出的Swift类名不匹配,就会导致Swift桥接文件无法正确识别DataStore的controller属性,自然就会报“Value of type 'DataStore' has no member 'controller'”的错误。
解决方案(二选一即可)
方案1:修改Objective-C代码适配Swift的重命名
把DataStore里所有的Controller类型替换成NHController,和Swift类的@objc重命名保持一致:
- 修改
DataStore.h:
@class NHController; @interface DataStore: NSObject @property (readonly, strong, nonatomic) NHController *controller; @end
- 修改
DataStore.m:
#import <Foo/Foo-Swift.h> @interface DataStore () @property (nonatomic, strong) NHController *controller; @end
方案2:移除Swift类的自定义@objc命名
如果你希望Objective-C里直接用Controller这个类名,去掉Controller.swift里的@objc(NHController),只保留@objc即可:
@objc public class Controller: NSObject { // 类内容不变 }
额外验证步骤
完成上述修改后,再执行以下操作确保生效:
- 清理项目(
Cmd+Shift+K) - 删除Derived Data(可以通过Xcode的
Preferences > Locations找到路径后删除) - 重新构建项目(
Cmd+B)
这样调整后,Swift类Baz就能正常访问DataStore的controller属性了。
内容的提问来源于stack exchange,提问作者nambatee
相关产品推荐
相关产品推荐

