ビュー コントローラーの実装ファイルでこの配列を宣言しました。
NSMutableArray *images = [NSMutableArray array];
後で UIImageViews を追加する空の可変配列が必要でした。常にエラーを返します:
initializer element is not constant
ビュー コントローラーの実装ファイルでこの配列を宣言しました。
NSMutableArray *images = [NSMutableArray array];
後で UIImageViews を追加する空の可変配列が必要でした。常にエラーを返します:
initializer element is not constant
適切な解決策はimages
、インスタンス変数を作成してから、init
メソッドで初期化することです。
@implementation SomeClass {
NSMutableArray *images; // instance variable
}
- (id)init {
self = [super init];
if (self) {
images = [[NSMutableArray alloc] init];
}
return self;
}
これは一例です。特定のinit...
方法がある場合は、代わりにそれを使用してください。
インスタンス変数として、クラス内の他のメソッドがアクセスできるようにimages
なり、クラスの各インスタンスは独自の のコピーを取得しますimages
。
もっとコードを表示する必要がありますが、それが実際にエラーになっている行である場合、問題は明らかです。
非常に特定の場所での宣言時に のみ、変数を動的に初期化できます。メソッドの呼び出しを動的に含めます。
NSMutableArray *a = [NSMutableArray array]; // this will error.
static NSMutableArray *a = [NSMutableArray array]; // this will error.
@implementation Booger
{
NSMutableArray *a = [NSMutableArray array]; // this will error
}
NSMutableArray *a = [NSMutableArray array]; // this will error.
- (void)bar
{
NSMutableArray *a = [NSMutableArray array]; // this is fine
}
オブジェクト指向全体について、もう少し深く掘り下げる必要があるようです。クラスは、クラス (クラス メソッド) またはクラスの単一インスタンス (インスタンス メソッド) で動作するメソッドと呼ばれる関数のコレクションです。インスタンスは、そのインスタンスでメソッドが呼び出されたときにすべてのメソッドにアクセスできる状態を格納できます。従来の OO では、そのような状態はインスタンス変数に格納されます。通常、そのインスタンス変数の値を設定および取得するペア インスタンス メソッドを定義します。これらは、アクセサーまたはセッター/ゲッターと呼ばれます。最新の Objective-C では、プロパティを使用して、インスタンス変数とインスタンス変数にアクセスするメソッドの両方を宣言します。
したがって:
@interface MyClass:NSObject
@property(strong) NSMutableArray *myArray;
@end
@implementation MyClass
// the @property will automatically create an instance variable called _myArray,
// a getter method called -myArray and a setter called -setMyArray:
- init
{
self = [super init];
if (self) {
_myArray = [NSMutableArray array]; // set the ivar directly in init
}
return self;
}
- (void)maybeAddThisThing:(Thing *)aThing
{
if ([aThing isCool] && ![[self myArray] containsObject:aThing]) {
[[self myArray] addObject:aThing];
}
}
- (void)nukeFromOrbit
{
[self setMyArray:[NSMutableArray array]];
// or you could do [[self myArray] removeAllObjects];
}
あなたの構造のリターンには、NSMutableArray
コンパイル時に知られているアドレスがありません。メソッドスコープ内でのみ動的に初期化できます。
ただし、静的な初期化は問題ありません。たとえば、NSString *myString = @"Hello String";
グローバルスコープでは問題なくコンパイルされます。