Programing

Objective-c에서 배열을 상수로 선언하는 방법은 무엇입니까?

lottogame 2020. 11. 24. 07:33
반응형

Objective-c에서 배열을 상수로 선언하는 방법은 무엇입니까?


다음 코드는 나에게 오류를 제공합니다.

//  constants.h
extern NSArray const *testArray;
//  constants.m
NSArray const *testArray = [NSArray arrayWithObjects:  @"foo", @"bar", nil];

내가 얻는 오류는
initializer element is not constant

또는 포인터 표시기 (*)를 제거하면 다음과 같은 결과가 나타납니다.
statically allocated instance of Objective-C class 'NSArray'


요컨대, 할 수 없습니다. Objective-C 객체는 NSString 상수를 제외하고는 런타임에만 생성되므로 표현식을 사용하여 초기화 할 수 없습니다.

몇 가지 접근 방식이 있습니다.

(1) 키워드 NSArray *testArray없이 선언 const한 다음 응용 프로그램 수명주기 동안 매우 일찍 호출되는 값을 설정하는 약간의 코드가 있습니다.

(2) 배열을 반환하는 편리한 클래스 메서드를 선언 한 다음 static NSArray *myArray해당 메서드 내 에서를 사용 하고 단일 항목으로 처리합니다 (인스턴스화 방법에 대한 수백만 개의 답변을 보려면 SO 검색 "objective-c singleton").


파티에 조금 늦었지만 프로그램 과정에서 값을 변경하지 않기 때문에 문자열 만 처리했다면 배열을 사용하여 C배열 을 선언하여 다음을 수행 할 수 있습니다 .

extern NSString * const MY_CONSTANT_STRING_ARRAY[];

당신의 constants.h파일, 다음에 constants.m그렇게처럼 개체를 추가 할 수 있습니다 :

NSString * const MY_CONSTANT_STRING_ARRAY[] = { @"foo", @"bar" };

그런 다음 멤버에 액세스하려면 C sizeof()연산자를 사용하여 for 루프를 수행 할 수 있습니다 .

이것은 분명히 C배열이고 a NSArray가 아니므로 모든 재미있는 메서드가 첨부되지 않으므로 objectAtIndex:위에서 설명한 메서드를 사용하여 모든 문자열을 반복하고 반환하는 프로그램 어딘가에 도우미 함수를 만들 수 있습니다. NSArray(또는 NSMutableArray짝수). 그러나 내가하는 일을하고 NSString있고 프로그램 전체에서 사용할 상수 배열이 필요한 경우이 방법이 가장 효과적입니다.

이런 식으로 이렇게하면 당신의 문자열 배열 contants 모두에서 캡슐화 constants.h하고, 추가하여 여전히 프로그램 전반에 걸쳐 사용할 수 있습니다 constants.h귀하의 .pch파일이 아닌 단지 값이 배열에 대한 싱글을 만들거나 그렇다고는 목적을 패배 약간의 코드로 배열을 설정 (A)의 constants파일 그것은에서 실제 상수를 제거하기 때문에 constants파일 ..

@JesseGumpo의 코멘트에 따라 편집 :

sizeof()배열의 크기를 결정하는 데 사용 하는 데 문제가있을 수 있으므로 간단한 해결 방법은 다음과 같이 상수 파일에 배열의 크기를 선언하는 것입니다.

//.h
extern int SIZE_OF_MY_CONSTANTS_ARRAY;  

///.m
int SIZE_OF_MY_CONSTANTS_ARRAY = 2;

그런 다음 for 루프의 멤버에 액세스하려면 다음과 같이 할 수 있습니다.

for (int i=0; i < SIZE_OF_MY_CONSTANTS_ARRAY; i++) 
        NSLog(@"my constant string is: %@", MY_CONSTANT_STRING_ARRAY[i]);

예, 이것은 배열의 크기를 동적으로 캡처하지 않지만 상수 파일에서 배열을 선언하는 경우 처음부터 해당 배열의 크기를 이미 알고 있으므로 두 줄의 코드를 더 추가하더라도 여전히 상수 파일에 배열을 갖는 작업을 수행합니다.

누구든지 더 이상 제안이 있거나 다른 C트릭을 알고 있다면 아래에 의견을 남겨주세요!


다음은 메서드 범위의 정적 인스턴스에 대해 한 줄로 수행하는 매크로입니다.

#define STATIC_ARRAY(x, ...)   \
        static NSArray* x=nil; \
        static dispatch_once_t x##onceToken; \
        dispatch_once(&x##onceToken, ^{ x = @[ __VA_ARGS__ ]; });

사용 예

    STATIC_ARRAY(foo, @"thing1", @"thing2", [NSObject new]);

저에게는 상수 배열에 대해 다음 구현을 사용하는 것이 더 편리합니다.

static NSString * kHeaderTitles [3] = {@ "ACCOUNT DETAILS", @ "SOCIAL NETWORK", @ "SETTINGS"};
static int kNumbers[3] = {1, 2, 3};

매우 쉽습니다.

#define arrayTitle [NSArray arrayWithObjects: @"hi",@"foo",nil]

세미콜론없이 구현하기 전에 넣습니다.

도움이되기를 바랍니다.


"Constants.h"라는 헤더 파일이 있고 다음 상수 배열 내에 있습니다.

#define arrayOfStrings @[@"1", @"2", @"3", @"4"]
#define arraysOfIds @[@(1), @(2), @(3), @(4)]

Basically, when you call arrayOfStrings in your code, is replaced with @[@"1", @"2", @"3", @"4"] and the same thing with arraysOfIds.

참고URL : https://stackoverflow.com/questions/2436463/how-do-i-declare-an-array-as-a-constant-in-objective-c

반응형