2015-04-30 3 views
0

iOS newb пытается вывести массив из другого класса и получить ошибку. По сути, я не совсем понимаю разницу между методами и свойствами, я понимаю, поэтому это может помочь мне лучше понять это.Objective-C: Синтаксис для вызова метода из другого класса

Я создал метод, который возвращает массив. Я хочу использовать этот массив в другом классе (например, функция, возвращающее значение на других языках), поэтому я думал, что я хотел бы сделать это следующим образом:

class1 
- (id) getTags{ 
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Tags"]; 
    fetchRequest.resultType = NSDictionaryResultType; 

    NSError *error  = nil; 
    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest 
                    error:&error]; 

    NSMutableArray * tags = [[results valueForKey:@"tag"] mutableCopy]; 
    return tags; 
} 

Другими словами, я хочу, чтобы использовать то, что этот метод возвращает как своего рода переменная, которая в Objective C называется свойствами. Этот метод также находится в файле .h, чтобы он был общедоступным.

В классе 2 импортировать класс 1 сверху, а затем попытаться вызвать метод следующим образом:

NSArray *newarray = [class1 getTags]; 

Однако я получаю ошибку «Ни один из известных метод класса для getTags селекторных»

Может кто-нибудь сказать мне, что я делаю неправильно?

Спасибо.

ответ

3

Я подозреваю, что эта линия;

NSArray *newarray = [class1 getTags]; 

Фактически, вы должны использовать экземпляр класса, а не сам класс. Чтобы использовать этот вызов функции, вы должны объявить getTags как функцию уровня класса (+ функция), not-function

Так что ваш код должен выглядеть так:

class1 *class1Instance = [[class1 alloc] init]; 
NSArray *newarray = [class1Instance getTags]; 
2

Проблема заключается в код NSArray *newarray = [class1 getTags];

Вы вызываете метод класса getTags в class1; однако у вас есть только метод экземпляра, который называется getTags в class1.

Чтобы решить эту проблему, измените знак-to + в методе, который изменит ваш метод от метода экземпляра к методу класса. (В java-терминах: + есть то место, где вы ставите статику в методе).

Однако в вашем коде есть довольно много проблем с стилем. Во-первых, я не думаю, что ввод кода в .h - хорошая практика. То, что вы можете это

.h

@interface Class1 
+ (NSArray *)getTags; 
@end 

.m

@implementation Class1 
+ (NSArray *)getTags { ... } 
@end 

так вы объявляете общедоступный интерфейс в файл .h и реализации в ом. Кроме того, вы, вероятно, хотите использовать название своего класса.

Нельзя использовать id в качестве возвращаемого типа и назначить его id от [class1 getTags] до NSArray *. Там есть неявный бросок, который иногда может привести к хорошему времени отладки.

NSArray МОЖЕТ быть использован в качестве возвращаемого типа вашего метода, потому что NSMutableArray наследуются от NSArray - Apple Documentation of NSMutableArray

+0

Первоначально я пытался NSArray, но он дал ошибку «противоречивый тип возврата» и в обратном трубопроводе ниже дал ошибке «Возвращение NSMutableArray * ____ сильного из функции с несовместимым типом результата ". Переключение на id избавилось от двух ошибок. – user1904273

+0

Вы использовали 'NSArray *' как возвращаемый тип, а не 'NSArray'? Это распространенная ошибка, когда люди сначала изучают Obj-C .. – Steven

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