การสร้างอาร์เรย์ของจำนวนเต็มใน iOS


100

ถ้าคุณต้องการสร้างอาร์เรย์ของจำนวนเต็มคุณสามารถใช้ NSInteger ได้หรือไม่? คุณต้องใช้ NSNumber หรือไม่? ถ้าเป็นเช่นนั้นทำไม?

คำตอบ:


160

คุณสามารถใช้อาร์เรย์ 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 เป็นเรื่องยุ่งยากสำหรับทุกอย่างยกเว้นการใช้งานเพียงครั้งเดียวซึ่งเป็นปัญหาน้อยกว่าในการห่ออาร์เรย์ใด ๆ ที่คุณวางแผนที่จะรักษาไว้เป็น NSArrays ของ NSNumber
Chuck

2
ใช่และจากการเพิ่มประสิทธิภาพระดับผู้เชี่ยวชาญภายใต้ฝากระโปรงของ [สันนิษฐาน] NSArrayฉันแน่ใจว่าคุณจะไม่รู้สึกถึงประสิทธิภาพ
dreamlax

@dreamlax ฉันสงสัยว่าการเพิ่มประสิทธิภาพระดับผู้เชี่ยวชาญแบบไหนที่อยู่ภายใต้ประทุนของ NSArray? การจัดสรรหน่วยความจำอัจฉริยะที่อาจเพิ่มขนาดหน่วยความจำที่จัดสรรเป็นสองเท่าเมื่อถึงขีด จำกัด ?
:)

2
@Andy: มีลักษณะที่แหล่งที่มาที่แท้จริงสำหรับ CFArray ที่นี่และตรวจสอบมาตรฐานที่นี่ มันฉลาดกว่าที่คุณคิดในตอนแรกเล็กน้อย
dreamlax

สมมติว่าอาร์เรย์นี้ใช้ภายในเมธอดเท่านั้นไม่มีปัญหากับการใช้ NSIntegers อาร์เรย์ C ใช่หรือไม่เพียงแค่ตรวจสอบซ้ำ ...
Dan Rosenstark

59

อาร์เรย์ 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

Swift Array:

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

ก็ถูกต้องเช่นกัน:

var array = Array(1...10)

หมายเหตุ: อาร์เรย์ถูกพิมพ์อย่างรุนแรงใน Swift; ในกรณีนี้คอมไพลเลอร์สรุปเนื้อหาว่าอาร์เรย์เป็นอาร์เรย์ของจำนวนเต็ม คุณสามารถใช้ไวยากรณ์ประเภทที่ชัดเจนนี้ได้เช่นกัน:

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

หากคุณต้องการอาร์เรย์ของ Doubles คุณจะใช้:

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

5

หากคุณต้องการใช้ NSArray คุณต้องมีคลาส Objective-C จึงจะใส่ได้ด้วยเหตุนี้ข้อกำหนด NSNumber

ที่กล่าวว่า Obj-C ยังคงเป็น C ดังนั้นคุณสามารถใช้อาร์เรย์ C ปกติและถือ ints ปกติแทน NSNumbers ได้หากคุณต้องการ


5

คุณสามารถใช้CFArrayแทน NSArray ได้ นี่คือบทความอธิบายวิธีการ

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

เช่นเดียวกันกับเวอร์ชัน CoreFoundation ของคอนเทนเนอร์อื่น ๆ ด้วย


3
หากมีข้อได้เปรียบของการใช้ CFArray มากกว่า NSArray ฉันไม่เห็น 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_

มีอะไรผิดปกติกับปกติNSSet(และใช้จำนวนเต็มรวมกับ an NSNumber)
dreamlax

@dreamlax ค่าใช้จ่าย แต่โดยทั่วไปแล้วคนที่ถามคำถามดังกล่าวไม่สามารถจัดการกับ C ได้และพวกเขามีจำนวนน้อยที่จะจัดเก็บดังนั้น NSArray หรือ NSSet จะต้องดีที่สุด
pronebird

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.