Nếu bạn muốn tạo một mảng các số nguyên, bạn có thể sử dụng NSInteger không? Bạn có phải sử dụng NSNumber không? Nếu vậy, thì tại sao?
Nếu bạn muốn tạo một mảng các số nguyên, bạn có thể sử dụng NSInteger không? Bạn có phải sử dụng NSNumber không? Nếu vậy, thì tại sao?
Câu trả lời:
Bạn có thể sử dụng một mảng C cũ thuần túy:
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]);
Hoặc, bạn có thể sử dụng dấu NSArray
hoặc NSMutableArray
, nhưng ở đây bạn sẽ cần phải gói từng số nguyên bên trong một NSNumber
cá thể (vì NSArray
các đối tượng được thiết kế để chứa các cá thể lớp).
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]);
NSArray
, tôi chắc chắn rằng bạn sẽ không cảm thấy hiệu suất bị ảnh hưởng.
Mảng C:
NSInteger array[6] = {1, 2, 3, 4, 5, 6};
Mảng Objective-C:
NSArray *array = @[@1, @2, @3, @4, @5, @6];
// numeric values must in that case be wrapped into NSNumbers
Mảng Swift:
var array = [1, 2, 3, 4, 5, 6]
Điều này cũng đúng:
var array = Array(1...10)
NB: mảng được gõ mạnh bằng Swift; trong trường hợp đó, trình biên dịch suy ra từ nội dung rằng mảng là một mảng các số nguyên. Bạn cũng có thể sử dụng cú pháp kiểu rõ ràng này:
var array: [Int] = [1, 2, 3, 4, 5, 6]
Nếu bạn muốn có một mảng Đôi, bạn sẽ sử dụng:
var array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] // implicit type-inference
hoặc là:
var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type
Nếu bạn muốn sử dụng một NSArray, bạn cần một lớp Objective-C để đưa vào nó - do đó yêu cầu NSNumber.
Điều đó nói rằng, Obj-C vẫn là C, vì vậy bạn có thể sử dụng mảng C thông thường và giữ các số nguyên thông thường thay vì Số NSN nếu bạn cần.
Bạn có thể sử dụng CFArray thay vì NSArray. Đây là một bài báo giải thích làm thế nào.
CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */
Điều tương tự cũng áp dụng cho phiên bản CoreFoundation của các vùng chứa khác.
Tôi đã tạo một trình bao bọc Objective C đơn giản xung quanh mảng C cũ tốt để sử dụng thuận tiện hơn: https://gist.github.com/4705733
Nếu thứ tự các số nguyên của bạn là không bắt buộc và nếu chỉ có các giá trị duy nhất
bạn cũng có thể sử dụng NSIndexSet hoặc NSMutableIndexSet Bạn sẽ có thể dễ dàng thêm và xóa các số nguyên hoặc kiểm tra xem mảng của bạn có chứa một số nguyên với
- (void)addIndex:(NSUInteger)index
- (void)removeIndex:(NSUInteger)index
- (BOOL)containsIndexes:(NSIndexSet *)indexSet
Kiểm tra tài liệu để biết thêm thông tin.
NSSet
(và sử dụng các số nguyên được bao bọc trong một NSNumber
)?
Tôi nghĩ việc sử dụng NSNumbers dễ dàng hơn rất nhiều. Tất cả những gì bạn cần làm:
NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1];
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2];
.
.
.
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil];
for
hoặc chỉ một mảng khác cho các số và sau đó arrayWithArray
.