Home > Enterprise >  How to read an objective-c array in swift? Its always returning nil
How to read an objective-c array in swift? Its always returning nil

Time:11-10

I have a NSArray declared in .h file as

@interface ClassName : NSObject
{
NSArray *myArray;
}
@property (nonatomic, strong) NSArray *myArray;
@end

In the .m file here is how I have it.

@implementation ClassName
NSArray* myArray;

I am trying to access this in swift as given below.

var x = ClassName().myArray

x is always nil.

CodePudding user response:

There are several issues with your Objective-C class. You've declared the myArray property (which is fine), but you've also added a public instance variable of the same name in the header file and you created a global variable (not instance variable) of the same name in the .m file. The following is what you should have:

In the .h file:

@interface ClassName : NSObject
@property (nonatomic, strong) NSArray *myArray;
@end

In the .m file:

@implementation ClassName

@end

That's it.

The next big issue is that you are accessing the myArray property but you never give it a value. This is why you always get nil.

This is no different than if you had a Swift class with an optional property that you never gave a value to.

Let's say you have the following Swift class:

class ClassName {
    var myArray: [Any]?
}

If you then did:

var x = ClassName().myArray

you would get nil just as you did using the Objective-C class. In both cases you need to create an instance of the class and assign an initial value to myArray.

var c = ClassName()
c.myArray = [ "Hi", "There" ]

Now you can access the array:

var x = c.myArray

BTW - assuming you want the array to hold specific types of values, you should update the property declaration in your Objective-C class.

For example:

@property (nonatomic, strong) NSArray<NSString *> *myArray;

if you wanted an array of NSString.

  • Related