iOS에서 정수 배열 만들기


98

정수 배열을 만들고 싶다면 NSInteger를 사용할 수 있습니까? NSNumber를 사용해야합니까? 그렇다면 그 이유는 무엇입니까?


정수 배열로 무엇을 하시겠습니까?
dreamlax 2010-07-27

확실하지 않다. 어딘가에서 어레이에 NSNumber를 사용해야한다는 말을 들었 기 때문에 궁금했습니다.
neuromancer

답변:


159

일반 오래된 C 배열을 사용할 수 있습니다.

NSInteger myIntegers[40];

for (NSInteger i = 0; i < 40; i++)
    myIntegers[i] = i;

// to get one of them
NSLog (@"The 4th integer is: %d", myIntegers[3]);

또는, 당신은 사용할 수 있습니다 NSArray또는 NSMutableArray, 그러나 여기에서 당신은 내부의 각 정수를 마무리해야합니다 NSNumber(때문에 예를 NSArray객체가 보류 클래스 인스턴스로 설계되어 있습니다).

NSMutableArray *myIntegers = [NSMutableArray array];

for (NSInteger i = 0; i < 40; i++)
    [myIntegers addObject:[NSNumber numberWithInteger:i]];

// to get one of them
NSLog (@"The 4th integer is: %@", [myIntegers objectAtIndex:3]);

// or
NSLog (@"The 4th integer is: %d", [[myIntegers objectAtIndex:3] integerValue]);

9
나는 C 배열이 사소한 일회성 사용을 제외하고는 그토록 번거 롭다는 점에 주목할 가치가 있다고 생각합니다. NSNumber의 NSArrays로 유지하려는 배열을 래핑하는 것이 실제로 문제가 적습니다.

2
예, 그리고 [아마도] 전문가 수준의 최적화가에서 제공 NSArray되므로 성능 저하를 느끼지 못할 것입니다.
dreamlax

@dreamlax NSArray의 내부에 어떤 종류의 전문가 수준 최적화가 있는지 궁금합니다. 한도에 도달하면 할당 된 메모리의 크기를 두 배로 늘리는 스마트 메모리 할당?
Ben Sinclair

2
@Andy : 여기 에서 CFArray의 실제 소스를보고 여기 에서 벤치 마크를 확인 하십시오 . 처음에 생각했던 것보다 조금 더 똑똑합니다.
dreamlax

?이 배열은 단지 법에서 사용된다고 가정하면, NSIntegers의 C 배열 그냥 더블 확인 ... 사용에 아무런 문제가 없습니다
댄 Rosenstark는

58

C 어레이 :

NSInteger array[6] = {1, 2, 3, 4, 5, 6};

Objective-C 어레이 :

NSArray *array = @[@1, @2, @3, @4, @5, @6];
// numeric values must in that case be wrapped into NSNumbers

스위프트 어레이 :

var array = [1, 2, 3, 4, 5, 6]

이것도 정확합니다.

var array = Array(1...10)

주의 : 배열은 Swift에서 강력하게 입력됩니다. 이 경우 컴파일러는 배열이 정수 배열임을 콘텐츠에서 유추합니다. 이 명시 적 유형 구문도 사용할 수 있습니다.

var array: [Int] = [1, 2, 3, 4, 5, 6]

Double 배열을 원하면 다음을 사용합니다.

var array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] // implicit type-inference

또는:

var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type

1
음의 정수에 해당하는 "@number"구문은 무엇입니까?
Ziofil 2014 년

5

NSArray를 사용하려면 Objective-C 클래스가 필요하므로 NSNumber 요구 사항이 필요합니다.

즉, Obj-C는 여전히 C이므로 필요한 경우 일반 C 배열을 사용하고 NSNumbers 대신 일반 정수를 보유 할 수 있습니다.


4

NSArray 대신 CFArray 를 사용할 수 있습니다 . 여기에 방법을 설명하는 문서입니다.

CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
  CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */

다른 컨테이너의 CoreFoundation 버전에도 동일하게 적용됩니다.


3
NSArray보다 CFArray를 사용하는 이점이 있다면 나는 그것을 보지 못합니다. NSArray는 후드 아래의 CFArray입니다. 이것은 단지 어려운 방식으로하는 것입니다.
David Gish

1
@Cryptognome 여기에는 약간의 차이가 있습니다. CFArray는 콜백없이 생성 되었기 때문에 아무것도 유지하거나 해제하지 않습니다. 나는 동의하지만 어떤 이점도없는 것 같습니다.
dreamlax


3

정수 순서가 필요하지 않고 고유 한 값만있는 경우

NSIndexSet 또는 NSMutableIndexSet을 사용할 수도 있습니다. 정수를 쉽게 추가 및 제거하거나 배열에 정수가 포함되어 있는지 확인할 수 있습니다.

- (void)addIndex:(NSUInteger)index
- (void)removeIndex:(NSUInteger)index
- (BOOL)containsIndexes:(NSIndexSet *)indexSet

자세한 내용 은 설명서 를 확인하십시오 .


2
끔찍한 생각입니다. 다음은 Apple 문서의 일부입니다. 인덱스 세트는 인덱스를 정렬 된 범위로 저장하기 때문에 임의의 정수 값 컬렉션을 저장하기 위해 인덱스 세트를 사용해서는 안됩니다. 이것은 개별 정수 모음을 저장하는 것보다 더 효율적입니다. 또한 각 인덱스 값은 인덱스 세트에서 한 번만 나타날 수 있습니다.
Rudolf Adamkovič

1
나는 동의하고 이것이 경고와 함께 내 응답을 시작한 이유입니다. 그러나 정수 배열에 대해이 질문을하고 실제로 인덱스 세트가 필요한 사람들을 알고 있습니다. 그래서 제가이 대체 대답을주었습니다.
didier_v_ 2013 년

일반 NSSet(및으로 래핑 된 정수 사용 NSNumber)에 문제가 있습니까?
dreamlax

@dreamlax 오버 헤드이지만 일반적으로 이러한 질문을하는 사람들은 C를 처리 할 수 ​​없으며 저장할 수있는 숫자가 적기 때문에 NSArray 또는 NSSet이 가장 좋습니다.
Ben Sinclair

2

NSNumbers를 사용하는 것이 훨씬 쉽다고 생각합니다. 이 모든 작업을 수행해야합니다.

NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1];
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2];
.
.
.
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil];

하지만 배열에 10 개 또는 100 개의 숫자가 있으면 어떻게 될까요?
Henson

1
당신은 사용할 수 있습니다 for또는 다음 또 다른 숫자에 대한 배열하고 arrayWithArray.
Neeku 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.