3

私はゆっくりとアプリケーションを動作状態に構築しています。

setCollectionとという 2 つの関数を使用してaddToCollectionいます。これらの関数は両方ともNSArray入力として受け入れます。

addこれらの関数の両方を使用する関数も呼び出します。コンパイルしようとすると、Xcode に次のエラーが表示されます。

「setCollection」が宣言されていません (この関数で最初に使用)

これは、呼び出された関数がアクティブな関数の下に定義されていることに関係していると思います。別の推測では、関数内で使用できるように関数をグローバル化する必要がありaddます。

私は通常、PHPコーダーです。Php がこれを処理する方法は最初のものです。呼び出される関数は、それらを使用する関数の前にある必要があります。そうしないと、関数が存在しないためです。関数を実行時に利用できるようにする方法はありますか、それともすべての関数を再配置して正しく機能させる必要がありますか?

4

2 に答える 2

8

次のように、事前に関数を宣言できます。

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];

//...
于 2009-01-27T14:52:54.717 に答える
5

関数がグローバル (クラスの一部ではない) である場合は、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

于 2009-01-27T15:00:22.893 に答える