Как объявить функцию в Какао после функции, использующей ее? - PullRequest
3 голосов
/ 27 января 2009

Я медленно собираю приложение в рабочее состояние.

Я использую две функции, которые называются setCollection и addToCollection. Обе эти функции принимают NSArray в качестве ввода.

У меня также есть функция с именем add, в которой я использую обе эти функции. Когда я пытаюсь скомпилировать, Xcode показывает ошибку:

'setCollection' undeclared (первое использование в этой функции)

Полагаю, это связано с тем, что вызываемая функция определена ниже активной функции. Другое предположение может заключаться в том, что функции должны быть глобализированы, чтобы их можно было использовать внутри моей add функции.

Я обычно php-кодер. способ, которым Php обрабатывает это, является первым. Вызываемые функции должны быть перед функциями, использующими их, потому что в противном случае они просто не существуют. Есть ли способ сделать функции еще доступными во время выполнения, или я должен переставить все функции, чтобы они функционировали должным образом?

Ответы [ 2 ]

8 голосов
/ 27 января 2009

Вы можете заранее объявить функции следующим образом:

void setCollection(NSArray * array);
void addToCollection(NSArray * array);

//...

// code that calls setCollection or addToCollection

//...

void setCollection(NSArray * array)
{
    // your code here
}

void addToCollection(NSArray * array)
{
    // your code here
}

Если вы создаете пользовательский класс, и это функции-члены (обычно называемые методами в Objective-C), вы должны объявить методы в заголовке вашего класса и определить их в исходном файле класса:

//MyClass.h:
@interface MyClass : NSObject
{

}

- (void)setCollection:(NSArray *)array;
- (void)addToCollection:(NSArray *)array;

@end


//MyClass.m:

#import "MyClass.h"

@implementation MyClass

- (void)setCollection:(NSArray *)array
{
    // your code here
}

- (void)addToCollection:(NSArray *)array
{
    // your code here
}

@end


//some other source file

#import "MyClass.h"

//...

MyClass * collection = [[MyClass alloc] init];
[collection setCollection:someArray];
[collection addToCollection:someArray];

//...
5 голосов
/ 27 января 2009

Если ваши функции глобальные (не являются частью класса), вам просто нужно поместить объявление перед использованием, как предлагает eJames.

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

@interface Myclass()
- (void) setCollection:(NSArray*)array;
- (void) addToCollection:(NSArray*)array;
@end

@implementation Myclass

// Code that calls setCollection or addToCollection

- (void) setCollection:(NSArray*)array
{
    // your code here
}

- (void) addToCollection:(NSArray*)array
{
    // your code here
}

@end

Таким образом, вам не нужно выставлять свои функции в главном интерфейсе MyClass.

...