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 |