Xcode : นับองค์ประกอบในอาร์เรย์สตริง

มีวิธีใดที่รวดเร็วในการรับจำนวนสตริงภายในอาร์เรย์ NSString หรือไม่

NSString *s[2]={@"1", @"2"}

ฉันต้องการดึงความยาวของ 2 จากสิ่งนี้ ฉันมีบางอย่างเช่น (s.size) ฉันรู้ว่ามีวิธี -length แต่นั่นใช้สำหรับสตริงไม่ใช่อาร์เรย์สตริง ฉันยังใหม่กับ Xcode โปรดใช้ความสุภาพ


person Vlad Otrocol    schedule 23.02.2012    source แหล่งที่มา


คำตอบ (3)


ใช้ NSArray

NSArray *stringArray = [NSArray arrayWithObjects:@"1", @"2", nil];
NSLog(@"count = %d", [stringArray count]);
person beryllium    schedule 23.02.2012
comment
ใช่ ฉันจะใช้อาร์เรย์ที่ไม่แน่นอนในตอนท้าย แต่เพียงเพราะความอยากรู้เท่านั้น ไม่มีทางที่คุณจะดึงความยาวนี้กลับมาได้จริงหรือ? - person Vlad Otrocol; 23.02.2012
comment
จริงๆ แล้ว คุณควรใช้ [stringArray count] เนื่องจากเป็นวิธีอินสแตนซ์ ไม่ใช่คุณสมบัติ - person Rengers; 23.02.2012
comment
@Rengers นั่นไม่ได้สร้างความแตกต่างเลย คุณสมบัติแบบอ่านอย่างเดียวนั้นเหมือนกับวิธีการอินสแตนซ์ทุกประการ - person Sulthan; 23.02.2012
comment
@Rengers นับ - เป็นผู้ทะเยอทะยาน สามารถใช้เป็นทรัพย์สินได้ - person beryllium; 23.02.2012
comment
ฉันรู้ว่ามันไม่ได้สร้างความแตกต่าง มันเป็นนิสัยที่ผิดที่จะเรียกวิธีการโดยใช้สัญกรณ์คุณสมบัติ ;) - person Rengers; 23.02.2012
comment
ใช่แล้ว ผู้ทะเยอทะยานและผู้กำหนด อย่างไรก็ตาม การเรียกวิธีการอินสแตนซ์เหมือนกับว่ามันถูกกำหนดให้เป็นคุณสมบัติ IMHO ยังคงเป็นแนวปฏิบัติที่ไม่ดี - person Rengers; 23.02.2012
comment
@Rengers สัญกรณ์ดอทไม่เกี่ยวข้องกับคุณสมบัติ เป็นอีกทางเลือกหนึ่งในการเรียกวิธีการ ใช่ มันถูกสร้างขึ้นเนื่องจากคุณสมบัติ แต่ไม่คำนึงถึงความคิดเห็นของคุณ การใช้มันกับวิธีการที่ไม่ได้สังเคราะห์จากคุณสมบัติก็ไม่ใช่แนวปฏิบัติที่ไม่ดี ในกรณีส่วนใหญ่ คุณจะต้องค้นหาส่วนหัวของชั้นเรียนเพื่อเรียนรู้วิธีการประกาศเมธอด - person Sulthan; 23.02.2012
comment
ฉันรู้ว่ามันเป็นเพียงน้ำตาลวากยสัมพันธ์ แต่จะเป็นอย่างไรถ้าฉันสร้างเมธอดที่เรียกว่า login ที่ทำสิ่งต่างๆ มากมาย สื่อสารกับเซิร์ฟเวอร์ และพลิกมุมมองเมื่อเสร็จแล้ว เป็นวิธีปฏิบัติที่ไม่ดีที่จะเรียกสิ่งนั้นโดยใช้ foo.login? มันได้ผลใช่ไหม? IMHO ตราบใดที่เอกสารระบุว่าเป็นวิธีอินสแตนซ์ คุณควรเรียกมันว่าเป็นวิธีอินสแตนซ์ แต่เดี๋ยวก่อน ต่างคน ต่างสไตล์ :) - person Rengers; 23.02.2012
comment
หากฉันคิดว่า login มีลายเซ็น -(id)login ซึ่งค่อนข้างแปลกสำหรับวิธีการดังกล่าว ชื่อของมันบ่งบอกว่าไม่ใช่ getter และไม่ควรใช้เครื่องหมายจุด คุณจะเรียกมันด้วยเครื่องหมายจุดถ้ามีคนเพิ่ม @property (nonatomic, readonly) id login ในชั้นเรียนหรือไม่? - person Sulthan; 23.02.2012

ใช่ มีวิธีอยู่ โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะในกรณีที่ไม่ได้สร้างอาร์เรย์แบบไดนามิกโดยใช้ malloc


NSString *array[2] = {@"1", @"2"}

//size of the memory needed for the array divided by the size of one element.
NSUInteger numElements = (NSUInteger) (sizeof(array) / sizeof(NSString*));

อาร์เรย์ประเภทนี้เป็นเรื่องปกติสำหรับ C และเนื่องจาก Obj-C เป็นซูเปอร์เซ็ตของ C จึงสามารถใช้งานได้อย่างถูกกฎหมาย คุณจะต้องระมัดระวังเป็นพิเศษเท่านั้น

person Sulthan    schedule 23.02.2012

พยายามค้นหา _countf ใน object-c แต่ดูเหมือนว่าจะไม่มีอยู่ ดังนั้น สมมติว่าตัวดำเนินการ sizeof และ typeof ทำงานได้อย่างถูกต้อง และคุณผ่านอาร์เรย์ c ที่ถูกต้อง สิ่งต่อไปนี้อาจใช้ได้

#define _countof( _obj_ ) ( sizeof(_obj_) / (sizeof( typeof( _obj_[0] ))) )

NSString *s[2]={@"1", @"2"} ;
NSInteger iCount = _countof( s ) ;
person redwud    schedule 29.12.2013