如何在Swift中读取Objective-C数组?调用后始终返回nil
问题解决:Swift访问Objective-C类的NSArray属性始终为nil
你的代码存在两个核心问题:
- .m文件中的全局变量与实例属性无关:你在
@implementation外声明的NSArray* myArray;是全局变量,不属于ClassName的实例成员,和你在.h中声明的实例属性myArray没有任何关联。 - 实例属性未初始化:你没有对
@property对应的实例变量进行初始化操作,Objective-C中对象类型的实例变量默认值为nil,所以Swift访问时自然得到nil。
修正步骤:
- 删除全局变量:移除.m文件中的
NSArray* myArray;这一行代码。 - 初始化实例属性:在类的初始化方法
init中为属性对应的实例变量赋值。由于Objective-C现在默认会自动为@property合成带下划线前缀的实例变量(比如_myArray),直接在init中初始化即可。
修正后的.m文件代码:
@implementation ClassName - (instancetype)init { self = [super init]; if (self) { // 初始化数组,示例为包含元素的数组,也可以是@[]空数组 _myArray = @[@"Item 1", @"Item 2", @"Item 3"]; } return self; } @end
补充说明:
如果你需要手动控制实例变量的名称(不推荐,默认自动合成更规范),可以使用synthesize关键字指定,比如:
@implementation ClassName // 指定实例变量名为myArray,而非默认的_myArray @synthesize myArray = myArray; - (instancetype)init { self = [super init]; if (self) { myArray = @[]; } return self; } @end
完成上述修改后,Swift中的代码var x = ClassName().myArray就能正确获取到初始化后的数组,不再是nil。
内容的提问来源于stack exchange,提问作者Vijay Ananth
相关产品推荐
相关产品推荐

