2016-11-25 2 views
0

В @interface, у меня есть заявление:Как инициализировать переменную класса Objective C в init?

@interface myClass { 
    NSDictionary * myData; 
} 

@property (nonatomic, assign) NSDictionary * data; 
+ (id) initWithData:(NSDictionary *)data; 

@end 

В @implementation, у меня есть этот код:

@implementation 

@synthesize data; 

+ (id) initWithData:(NSDictionary *)freshData { 
    self = [super init]; 
    if (self) { 
     self->data = freshData; 
    } 
    return self; 
} 

@end 

Но я получил ошибку Incomplete definition of type 'struct objc_class на self->data.

Если изменить его в self.data, я получил ошибку Member reference type 'struct objc_class *' is a pointer; did you mean to use '->'?

Если удалить self, я получил доступ к ошибке `экземпляра переменной«данные»в методе класса.

Но если я изменяю тип метода от + (метод класса) до - (метод экземпляра), я не могу получить доступ к init.

И я не могу исправить эту ошибку, изменив назначение с data на myData.

Как мне создать конструктор?

Ссылка, которую я узнал из (но не помогает), являются:

ответ

1

Вы можете сделать это, как этот также

+ (id) initWithData:(NSDictionary *)freshData { 
    return [[self alloc]initWithData:freshData]; 
} 
- (instancetype) initWithData:(NSDictionary *)freshData { 

    NSParameterAssert(freshData != nil); 

    self = [super init]; 

    if (self) { 
     self.data = freshData; 
    } 

    return self; 
} 
+0

Если я только реализую '- (instancetype) initWithData: (NSDictionary *) freshData' без' + (id) initWithData: (NSDictionary *) freshData', в чем же проблема? –

+0

Ну, вы также можете это сделать, если нет проблемы с созданием объекта этого класса, так как с помощью метода экземпляра вам нужно создать объект этого класса для использования этого метода и с помощью метода класса вы можете вызвать этот метод с помощью класса. – Rajat

+0

Проверьте это также на метод класса vs instance method - http: // stackoverflow.com/questions/1053592/what-is-the-difference-between-class-and-instance-methods – Rajat

1

Не используя публичный метод Init (+)

+ (id) initWithData:(NSDictionary *)data; 

Изменить на

- (instancetype) initWithData:(NSDictionary *)data; 

И я настоятельно рекомендую вам использовать instancetype вместо id (reference )

2

В общем, я бы не ожидать init* метода к быть методом класса. Как правило, у вас есть метод класса с таким именем, как default*, shared*, или *withDictionary:. Таким образом, для класса с именем myClass, я ожидал увидеть это:

+ (myClass*)myClassWithDictionary:(NSDictionary*)dict 
{ 
    return [[myClass alloc] initWithDictionary:dict]; 
} 

Это может быть важно, когда статический анализатор анализирует код, например. Именование значимо в Objective-C и подсказывает компилятору (и анализатору) о намерении кода.

+0

Вы имеете в виду '[UIColor colorWithCGColor:]'? –

+0

Да, вот что я имел в виду. – user1118321

+0

Хорошо, я думаю, что знаю, что не так, что я не могу получить доступ к конструктору метода инициализации экземпляра ... Я забыл сделать 'alloc' сначала перед' init'. Вот почему я могу получить доступ к методу 'init', если я изменил конструктор' init' в класс, потому что сразу написал '[MyClass initWithData:]'. Я настолько привык к простоте Swift, что, когда мне нужно вернуться к Objective C, я забыл про упражнение ... Тогда ваш ответ напоминает мне, почему 'init' должен быть методом экземпляра, а не методом класса. Благодаря! –

Смежные вопросы