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
'Programing' 카테고리의 다른 글
| 키보드 바로 가기를 사용하여 IntelliJ에서 메서드 매개 변수 재정렬 (0) | 2020.11.24 |
|---|---|
| 자바 객체의 속성 덤프 (0) | 2020.11.24 |
| 입력 및 텍스트 필드의 배경색? (0) | 2020.11.24 |
| 자바로지도 만들기 (0) | 2020.11.24 |
| jQuery 선택기에서 css : hover 상태를 정의하는 방법은 무엇입니까? (0) | 2020.11.24 |