ไวยากรณ์ของวิธีการใน Objective-C


176

บางคนสามารถอธิบายไวยากรณ์การประกาศวิธีนี้ให้ฉันได้ไหม ในฟังก์ชั่นนี้จำนวนแถวของ UIPickerView (สล็อตแมชชีน UI บน iPhone) จะถูกส่งกลับ จากความเข้าใจของฉันวิธีการที่เรียกว่า ' pickerView' และส่งกลับ NSInteger

มันส่งผ่านตัวชี้ไปที่ UIPickerview ที่เรียกว่า ' pickerView' ... ก่อนทำไมวิธีการที่เรียกว่าชื่อเดียวกันกับพารามิเตอร์?

ถัดไปมีพารามิเตอร์ NSInteger เรียกว่าองค์ประกอบที่บอกเราว่าองค์ประกอบใดที่เรากำลังนับแถว ตรรกะในการตัดสินใจว่าจะอยู่ในส่วนใดของวิธีการ

'คือnumberOfRowsInComponentอะไร ดูเหมือนว่าจะอธิบายค่าที่เราส่งคืน แต่มันอยู่ตรงกลางของพารามิเตอร์

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component
{
    if (component == kStateComponent)
        return [self.states count];

    return[self.zips count];
}

คำตอบ:


358

Objective-C ถูกออกแบบมาเพื่อการบันทึกเอกสารด้วยตนเองและพวกเขายืมมาจากประเพณีอันมั่งคั่งของ Smalltalk

-(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)componentฉันจะพยายามที่จะอธิบายสิ่งที่คุณได้ที่นี่

  • - (NSInteger)
    ส่วนแรกนี้บ่งชี้ว่านี่เป็นวิธีการอินสแตนซ์ C Objective ที่ส่งกลับวัตถุ NSInteger -(รีบ) บ่งชี้ว่านี่เป็นตัวอย่างวิธีการที่+จะแสดงให้เห็นว่านี่คือระดับวิธีการ ค่าแรกในวงเล็บคือประเภทส่งคืนของวิธีการ

  • pickerView:
    ส่วนนี้เป็นส่วนหนึ่งของชื่อข้อความ ชื่อข้อความเต็มpickerView:numberOfRowsInComponent:ในกรณีนี้คือ รันไทม์ Objective-C ใช้ข้อมูลวิธีการนี้และส่งไปยังผู้รับที่ระบุ ใน C
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component)บริสุทธิ์นี้จะมีลักษณะเหมือน อย่างไรก็ตามเนื่องจากนี่เป็น Objective-C ข้อมูลเพิ่มเติมจึงถูกบรรจุลงในชื่อข้อความ

  • (UIPickerView*)pickerView
    ส่วนนี้เป็นส่วนหนึ่งของการป้อนข้อมูล อินพุตที่นี่เป็นชนิดUIPickerView*และมีชื่อตัวแปรโลคัลของ pickerView

  • numberOfRowsInComponent:
    ส่วนนี้เป็นส่วนที่สองของชื่อข้อความ อย่างที่คุณเห็นที่นี่ชื่อข้อความจะถูกแบ่งออกเพื่อช่วยระบุข้อมูลที่คุณส่งให้ผู้รับ ดังนั้นถ้าผมจะข้อความแสดง myObject วัตถุกับตัวแปร foo และบาร์ผมจะพิมพ์:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    เมื่อเทียบกับ C ++
    myObject.pickerView(foo, bar);สไตล์:

  • (NSInteger)component
    นี้เป็นส่วนสุดท้ายของการป้อนข้อมูล อินพุตที่นี่เป็นชนิดNSIntegerและมีชื่อตัวแปรโลคัลของคอมโพเนนต์


18
+1 สำหรับคำตอบที่ดี ฉันขอแนะนำให้เปลี่ยน "factory" เป็น "class" ในจุดแรกของคุณเนื่องจาก "+" แสดงวิธีการเรียนอย่างเป็นทางการ มันเกิดขึ้นอย่างมากว่า "+" วิธีการต่าง ๆ เป็นวิธีโรงงาน แต่นั่นไม่ใช่คำจำกัดความที่เหมาะสม
e.James

2
ขอบคุณ! คำถามเพิ่มเติมหนึ่งข้อ: หากคุณส่งข้อความถึงวัตถุ myObject ด้วยตัวแปร foo และ bar อย่างที่คุณแสดง: [myObject pickerView: foo numberOfRowsInComponent: bar]; pickerView อ้างถึงชื่อเมธอดหรือพารามิเตอร์หรือไม่?
เครก

2
ทั้ง มันเป็นสไตล์ที่ดีสำหรับการอ้างถึงทั้งชื่อเมธอด AND และพารามิเตอร์ แต่ชื่อเมธอดแบบเต็มคือ pickerView จริง ๆ : numberOfRowsInComponent: หากคุณพยายามเรียกใช้ pickerView: คุณจะได้รับข้อผิดพลาดรันไทม์เนื่องจากไม่มีวิธีการ
locriani

1
ให้ฉันอธิบายในที่: the pickerView: ส่วนด้วยตัวเองควรดูพารามิเตอร์ต่อไปนี้เพื่อปฏิบัติตามรูปแบบการเข้ารหัสที่ดี อย่างไรก็ตามมันเป็นเพียง 1/2 ของชื่อวิธี ตัวอย่างที่ดีกว่าอาจเป็น [myObject setX: foo Y: bar] โดยที่เมธอดคือ setX: Y:
locriani

1
ฉันรู้ว่าคำตอบนี้เป็นคำตอบเก่า แต่ฉันใช้ชีวิตอยู่ในโลกของ. NET ในช่วงไม่กี่ปีที่ผ่านมา ฉันใหม่กับ Objective C และเปลี่ยนจากโลกเว็บสู่อุตสาหกรรมมือถือ ฉันขอขอบคุณสำหรับคำอธิบายที่มีเอกสารครบถ้วนซึ่งเกี่ยวข้องกับคำถาม +1
d3v1lman1337

52

ใน Objective-C ชื่อของวิธีการประกอบด้วยส่วนทั้งหมดของการประกาศที่ไม่ใช่การขัดแย้งและประเภท ดังนั้นชื่อของวิธีนี้จะเป็น:

pickerView:numberOfRowsInComponent:

วิธีการนี้จะเทียบเท่ากับฟังก์ชั่นแบบ C ที่มีลักษณะดังนี้

แก้ไข: (ด้วยความขอบคุณJarret Hardie ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1
+1 - คำอธิบายสั้น ๆ บางครั้งผมพบว่าหลอดไฟไปสำหรับคนที่ถ้าคุณเขียนเทียบเท่า C-สไตล์เป็น "NSInteger pickerViewNumberOfRowsInCompoent (UIPickerView * pickerView ส่วนประกอบ NSInteger)
Jarret ฮาร์ดี

ฉันชอบคำอธิบายของคุณการเขียนใน C ดีกว่ามาก
lcc

30

เมื่อเพิ่มคำตอบก่อนหน้านี้ฉันอยากจะบอกว่าวิธีการ Objective-C (หรือข้อความถ้าคุณต้องการ) มีชื่อพารามิเตอร์ภายนอกและภายใน

ดังนั้นในกรณีนี้:

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

numberOfRowsInComponentเป็นชื่อภายนอกชื่อที่คุณจะใช้เมื่อเรียกใช้วิธีนี้จากภายนอก

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

หวังว่าจะล้างมันออกไปสักหน่อย


1
ตามคำอธิบายของคุณชื่อเมธอดอาจถือเป็นชื่อภายนอกของพารามิเตอร์แรก นอกจากนี้ยังเหมาะกับร้องความคิดเห็นของ wilczarz
Jake

ประณามฉันพบคำตอบนี้ไม่ถูกต้อง ไม่มีอะไรเหมือนชื่อพารามิเตอร์ภายนอก / ภายใน มันคือตัวระบุ TYPE และ VARIABLE ฉันสงสัยว่าทำไมทุกคนพยายามอย่างหนักเพื่อกำหนดให้ ObjC เป็นภาษาธรรมชาติมันผิดธรรมชาติในทุกด้าน มันเป็นภาษาที่ช่วยให้เรียนรู้ได้โดยไม่ต้องใช้คำพูดที่แปลก
Siddharth

อาร์กิวเมนต์สามารถมีชื่อภายใน / ภายนอก นั่นเป็นเรื่องจริง
lcc

21

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

void setPersonData( char* name, int age, float height ) {

และใน Objective-C เมธอดจะมีความหมายมากกว่านี้ ( setPersonName: andAge: andHeight:)เช่น

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {

8
และทำไมจะตั้งค่าส่วนบุคคลข้อมูล (ถ่าน * และชื่อ, int ยังอายุ, ลอยยังสูง) ไม่สมเหตุสมผล? มันคือทั้งหมดที่เกี่ยวกับสิ่งที่คุณเข้าใจเกี่ยวกับไวยากรณ์ไม่มีอะไรเกี่ยวกับความตั้งใจของนักออกแบบ objc ที่ฉลาดที่นี่ พวกเขาเพียงแค่เพิ่มพวงของไวยากรณ์มากขึ้นว่าตรงไปตรงมาไม่ได้ทำให้ความรู้สึกใด ๆ .. :)
Siddharth

5
คุณเข้าใจผิดคำตอบที่ฉันกลัว setPersonalData (char * andName, int ยังAge, float ยังHeight) เป็นลายเซ็นไม่ใช่การเรียกใช้ การเรียกใช้ฟังก์ชั่นนี้จะเป็น setPersonData ("Tom", 25, 175) - และนั่นก็ไม่ได้บอกอะไรมาก? การเรียกใช้ Obj-C จะมีลักษณะเช่นนี้: [person setPersonName: @ "Tom" และอายุ: 25 และความสูง: 175];
wilczarz

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