ฉันจะส่งผ่านพารามิเตอร์หลายตัวใน Objective-C ได้อย่างไร


178

ฉันได้อ่านหลายโพสต์เกี่ยวกับไวยากรณ์ของวิธีการ Objective-C แต่ฉันเดาว่าฉันไม่เข้าใจชื่อหลายวิธี

ฉันพยายามที่จะสร้างวิธีการที่เรียกว่าgetBusStopsมีNSStringและค่าพารามิเตอร์และประเภทการกลับมาของNSTimeInterval NSMutableArrayนี่คือวิธีที่ฉันสร้างวิธี แต่เห็นได้ชัดว่าได้รับข้อผิดพลาดที่ runtime:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

ฉันเห็นอีกตัวอย่างหนึ่งด้วยวิธีการ:

-(NSInteger)pickerView:(UIPickerView *)pickerView
            numberOfRowsInComponent:(NSInteger)component

ฉันไม่เข้าใจว่าทำไมวิธีนี้จึงมีชื่อวิธีสำหรับแต่ละพารามิเตอร์ ฉันควรทำสิ่งเดียวกันกับสิ่งที่ชอบหรือไม่:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval

คำตอบ:


120

Objective-C ไม่มีชื่อพารามิเตอร์ดังนั้นทุกอย่างทางด้านซ้ายของโคลอนจึงเป็นส่วนหนึ่งของชื่อเมธอด ตัวอย่างเช่น,

getBusStops: forTime:

เป็นชื่อของวิธีการ ชื่อแตกหักดังนั้นจึงสามารถอธิบายได้มากขึ้น คุณสามารถตั้งชื่อวิธีการของคุณได้

getBusStops: :

แต่นั่นไม่ได้บอกอะไรคุณเกี่ยวกับพารามิเตอร์ที่สองมากนัก


157

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

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

หรือสิ่งที่คุณแนะนำ:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;

15
+1: อาร์กิวเมนต์ของฟังก์ชัน Objective-C เป็นตำแหน่งแน่นอนไม่มีชื่อดังนั้นฉลากจึงเป็นตัวเลือกและสำหรับการบริโภคของมนุษย์
Jarret ฮาร์ดี

ไม่แน่ใจว่าทำไมถึงต้องการ "forTime" ในลายเซ็น "timeInterval" สามารถใช้เป็นพารามิเตอร์ที่ 2 ในฟังก์ชั่นได้ใช่ไหม
galactica

@galactica - แน่นอนชื่อสามารถเป็นสิ่งที่เหมาะสมที่สุดสำหรับคุณ ตัวอย่างนี้ใช้คำศัพท์ของ OP เพื่อความมั่นคง
EM

2
ยังไม่แน่ใจว่าforTimeใช้ทำอะไร?
mrgloom

71

ใช่; ไวยากรณ์ของเมธอด Objective-C เป็นเช่นนี้ด้วยเหตุผลสองประการ หนึ่งในนั้นคือเพื่อให้ชัดเจนว่าพารามิเตอร์ที่คุณระบุคืออะไร ตัวอย่างเช่นถ้าคุณกำลังเพิ่มวัตถุไปยังNSMutableArrayที่ดัชนีที่แน่นอนคุณจะทำได้โดยใช้วิธีการ:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

วิธีการนี้เรียกว่าinsertObject:atIndex:และเป็นที่ชัดเจนว่าวัตถุจะถูกแทรกที่ดัชนีที่ระบุ

ในทางปฏิบัติเพิ่มสตริง "Hello, World!" ที่ดัชนี 5 ของการNSMutableArrayเรียกarrayจะถูกเรียกดังนี้:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

สิ่งนี้ยังช่วยลดความคลุมเครือระหว่างลำดับของพารามิเตอร์เมธอดเพื่อให้แน่ใจว่าคุณผ่านพารามิเตอร์ออบเจกต์ก่อนจากนั้นจึงเป็นพารามิเตอร์ดัชนี สิ่งนี้จะมีประโยชน์มากขึ้นเมื่อใช้ฟังก์ชันที่รับอาร์กิวเมนต์จำนวนมากและลดข้อผิดพลาดในการส่งอาร์กิวเมนต์

นอกจากนี้หลักการตั้งชื่อเมธอดยังเป็นเช่นนี้เนื่องจาก Objective-C ไม่รองรับการโอเวอร์โหลด อย่างไรก็ตามถ้าคุณต้องการที่จะเขียนวิธีการที่ทำงานเหมือนกัน แต่ใช้ชนิดข้อมูลที่แตกต่างกันก็สามารถทำได้ ยกตัวอย่างเช่นNSNumberคลาส มีวิธีการสร้างวัตถุหลายวิธีรวมไปถึง:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

ในภาษาเช่น C ++ คุณเพียงแค่โอเวอร์โหลดเมธอด number เพื่ออนุญาตให้ชนิดข้อมูลต่าง ๆ ถูกส่งผ่านเป็นอาร์กิวเมนต์ อย่างไรก็ตามใน Objective-C ไวยากรณ์นี้อนุญาตให้มีการใช้ฟังก์ชันที่แตกต่างหลากหลายของฟังก์ชันเดียวกันโดยการเปลี่ยนชื่อของวิธีการสำหรับแต่ละรุ่นของฟังก์ชัน


จำเป็นต้องใช้ชื่อพารามิเตอร์ระหว่างการเรียกใช้เมธอด (ส่งข้อความ) หรือไม่หากชื่อฟังก์ชันมีชื่อพารามิเตอร์?
Naveen

24

ข้อความก่อนแต่ละพารามิเตอร์เป็นส่วนหนึ่งของชื่อวิธีการ จากตัวอย่างของคุณชื่อของวิธีการเป็นจริง

-getBusStops:forTime:

แต่ละรายการ: แสดงถึงการโต้แย้ง ในการเรียกเมธอดชื่อเมธอดจะถูกแบ่งที่: s และอาร์กิวเมนต์จะปรากฏขึ้นหลังจาก: seg

[getBusStops: arg1 forTime: arg2]

3
ฉันคิดว่าคุณลืมที่จะเพิ่มชื่อของวิธีการ
Özgür

11

สำหรับการสร้างวิธีการ:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

สำหรับวิธีการโทร:

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

ผม:

(returnTypeOfSecontArgument) secondArgumentName ;

ในภาษาอื่นเราใช้โมฆะของไวยากรณ์ต่อไปนี้add(int one, int second) แต่วิธีการกำหนดอาร์กิวเมนต์ในOBJ_cนั้นแตกต่างกันตามที่อธิบายไว้ข้างต้น

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