2010-07-27 77 views
88

Nếu bạn muốn tạo một dãy 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 có thì tại sao?Tạo một dãy số nguyên trong iOS

+0

gì bạn muốn làm gì với mảng số nguyên? – dreamlax

+0

Không chắc chắn. Tôi chỉ nghe một nơi nào đó mà bạn phải sử dụng NSNumber cho mảng và vì vậy tôi đã tự hỏi về điều đó. – neuromancer

Trả lời

146

Bạn có thể sử dụng một đồng bằng mảng C 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]); 

Hoặc, bạn có thể sử dụng một NSArray hoặc NSMutableArray, nhưng ở đây bạn sẽ cần phải quấn lên mỗi số nguyên trong một thể hiện NSNumber (vì NSArray đối tượng được thiết kế để giữ các thể hiện của 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]); 
+8

Tôi nghĩ rằng nó đáng chú ý là mảng C là một rắc rối cho bất cứ điều gì nhưng tầm thường, sử dụng một lần mà nó thực sự ít rắc rối để bọc bất kỳ mảng bạn có kế hoạch giữ xung quanh như NSArrays của NSNumber. – Chuck

+2

Có, và đưa ra tối ưu hóa mức độ chuyên gia [có lẽ] dưới sự che chở của 'NSArray', tôi chắc chắn bạn sẽ không cảm thấy hiệu suất trúng. – dreamlax

+0

@dreamlax Tôi tự hỏi loại tối ưu hóa cấp độ chuyên gia nào nằm dưới mui xe của NSArray? Phân bổ bộ nhớ thông minh chỉ đơn giản là có thể tăng gấp đôi kích thước của bộ nhớ được cấp phát khi nó đạt đến giới hạn? :) p – Andy

5

Nếu bạn muốn sử dụng NSArray, bạn cần một lớp Objective-C để đưa vào - 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 các mảng C thông thường và giữ int thường xuyên thay vì NSNumbers nếu bạn cần.

4

Bạn có thể sử dụng CFArray thay vì NSArray. Here là một bài viết giải thích cách thực hiện.

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.

+2

Nếu có một lợi thế của việc sử dụng CFArray trên NSArray, tôi không nhìn thấy nó. Một NSArray LÀ một CFArray dưới mui xe; điều này chỉ làm điều đó một cách khó khăn. –

+1

@Cryptognome có một sự khác biệt nhỏ ở đây, CFArray sẽ không giữ lại hoặc phát hành bất cứ điều gì bởi vì nó được tạo ra mà không có callbacks. Tôi đồng ý mặc dù, dường như không có bất kỳ lợi thế nào. – dreamlax

2

Tôi nghĩ rằng việc sử dụng NSNumbers dễ dàng hơn rất nhiều. Điều này tất cả bạn cần làm:

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

nhưng nếu mảng của bạn có 10 hoặc 100 số thì sao? – Henson

+0

Bạn có thể sử dụng 'for' hoặc chỉ một mảng khác cho các số, và sau đó' mảngWithArray'. – Neeku

3

Nếu thứ tự của các số nguyên của bạn không yêu cầu, và nếu chỉ 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à loại bỏ 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

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

Kiểm tra documentation để biết thêm thông tin.

+2

Đó là một ý tưởng khủng khiếp. Đây là một phần từ tài liệu của Apple: _Bạn không nên sử dụng các bộ chỉ mục để lưu trữ một tập hợp các giá trị số nguyên tùy ý vì các bộ chỉ mục lưu trữ các chỉ mục như các dải được sắp xếp. Điều này làm cho chúng hiệu quả hơn lưu trữ một tập hợp các số nguyên riêng lẻ. Điều này cũng có nghĩa là mỗi giá trị chỉ mục chỉ có thể xuất hiện một lần trong chỉ mục set._ –

+1

Tôi đồng ý và đây là lý do tại sao tôi bắt đầu trả lời của mình bằng cảnh báo. Tuy nhiên, tôi biết một số người đã đặt câu hỏi này về mảng số nguyên và thực sự cần một bộ chỉ mục. Đó là lý do tại sao tôi đưa ra câu trả lời thay thế này. –

+0

Có gì sai với một 'NSSet' thông thường (và sử dụng các số nguyên được bọc trong một' NSNumber')? – dreamlax

44

C mảng:

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

Objective-C Array:

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] 

này là đúng quá:

var array = Array(1...10) 

NB: mảng được nhập mạnh vào Swift; trong trường hợp đó, trình biên dịch thâm nhập từ nội dung mà mảng là một mảng các số nguyên.Bạn có thể sử dụng cú pháp rõ ràng kiểu này, quá:

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

Nếu bạn muốn một loạt các đôi, bạn sẽ sử dụng:

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

hay:

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

Cú pháp "@number" tương đương cho số nguyên âm là gì? – Ziofil

+1

@Ziofil: '@ -1' hoạt động, cũng như' @ (- 1) '. – dreamlax

Các vấn đề liên quan