Phương thức Cú pháp trong Objective-C


176

Ai đó có thể giải thích cú pháp khai báo phương pháp này cho tôi? Trong chức năng này, số lượng hàng của UIPickerView (giao diện người dùng máy đánh bạc trên iPhone) đang được trả về. Theo hiểu biết của tôi, Phương thức được gọi là ' pickerView' và trả về NSInteger.

Nó chuyển một con trỏ tới UIPickerview được gọi là ' pickerView' ... đầu tiên, tại sao phương thức được gọi cùng tên với tham số?

Tiếp theo là tham số NSInteger được gọi là thành phần cho chúng ta biết thành phần nào chúng ta đang đếm các hàng cho. Logic để quyết định đó là trong cơ thể của phương pháp.

'Là numberOfRowsInComponentgì? Nó dường như mô tả giá trị chúng ta đang trả về, nhưng nó ở giữa các tham số.

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

    return[self.zips count];
}

Câu trả lời:


358

Các phương pháp Objective-C được thiết kế để tự ghi lại tài liệu và chúng mượn từ truyền thống phong phú của Smalltalk.

Tôi sẽ cố gắng giải thích những gì bạn có ở đây , -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component.

  • - (NSInteger)
    Phần đầu tiên này chỉ ra rằng đây là một phương thức cá thể Objective C trả về một đối tượng NSInteger. các -(dash) chỉ ra rằng đây là một ví dụ phương pháp, nơi một +sẽ chỉ ra rằng đây là một lớp học phương pháp. Giá trị đầu tiên trong ngoặc đơn là kiểu trả về của phương thức.

  • pickerView:
    Phần này là một phần của tên tin nhắn . Tên tin nhắn đầy đủ trong trường hợp này là pickerView:numberOfRowsInComponent:. Thời gian chạy Objective-C lấy thông tin phương thức này và gửi nó đến người nhận được chỉ định. Trong C thuần, điều này sẽ trông như thế
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component). Tuy nhiên, vì đây là Objective-C, thông tin bổ sung được đóng gói vào tên tin nhắn.

  • (UIPickerView*)pickerView
    Phần này là một phần của đầu vào . Đầu vào ở đây là loại UIPickerView*và có một tên biến cục bộ của pickerView.

  • numberOfRowsInComponent:
    Phần này là phần thứ hai của tên tin nhắn . Như bạn có thể thấy ở đây, tên tin nhắn được chia ra để giúp cho biết thông tin bạn đang truyền đến người nhận. Vì vậy, nếu tôi nhắn tin cho một đối tượng myObject với các biến foo và bar, tôi sẽ gõ:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    trái ngược với kiểu C ++ :
    myObject.pickerView(foo, bar);.

  • (NSInteger)component
    Đây là phần cuối cùng của đầu vào . đầu vào ở đây là loại NSIntegervà có một tên biến cục bộ của thành phần.


18
+1 cho một câu trả lời tuyệt vời. Tôi sẽ đề nghị thay đổi "nhà máy" thành "lớp" trong điểm đầu tiên của bạn, vì "+" chính thức chỉ ra một phương thức lớp. Nó chỉ xảy ra rằng nhiều phương thức "+" là phương thức nhà máy, nhưng đó không phải là định nghĩa đúng.
e.James

2
Cảm ơn! Thêm một câu hỏi: Nếu bạn đã nhắn tin cho một đối tượng myObject với các biến foo và bar như bạn đã hiển thị: [myObject pickerView: foo numberOfRowsInComponent: bar]; PickerView có đề cập đến tên phương thức hoặc tham số không?
Craig

2
Cũng không. Đó là phong cách tốt để nó tham chiếu đến cả tên phương thức AND tham số, nhưng tên phương thức đầy đủ thực sự là pickerView: numberOfRowsInComponent :. Nếu bạn cố gắng gọi pickerView:, bạn sẽ nhận được lỗi thời gian chạy, vì phương thức sẽ không tồn tại.
locriani

1
Hãy để tôi làm rõ về điều đó: phần pickerView: part NÊN tham khảo tham số sau, để theo phong cách mã hóa tốt. Tuy nhiên, nó chỉ bằng 1/2 tên phương thức. Một ví dụ tốt hơn có thể là [myObject setX: foo Y: bar], trong đó phương thức được đặtX: Y :.
locriani

1
Tôi biết câu trả lời này là một câu hỏi cũ, nhưng tôi đã sống trong một thế giới .NET trong vài năm qua. Tôi chưa quen với Objective C và đang chuyển từ thế giới web sang ngành công nghiệp di động. Tôi muốn cảm ơn bạn vì một lời giải thích được ghi chép tốt như vậy có liên quan đến câu hỏi. +1
d3v1lman1337

52

Trong Objective-C, tên của một phương thức bao gồm tất cả các phần của khai báo không phải là đối số và kiểu. Do đó, tên của phương thức này sẽ là:

pickerView:numberOfRowsInComponent:

Phương thức này sẽ tương đương với hàm kiểu C trông như sau:

chỉnh sửa: (cảm ơn Jarret Hardie ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1
+1 - mô tả ngắn đẹp. Đôi khi tôi thấy bóng đèn bật sáng cho mọi người nếu bạn viết kiểu C tương đương là "NSInteger pickerViewNumberOfRowsInCompoent (UIPickerView * pickerView, thành phần NSInteger)
Jarret Hardie

Tôi thích lời giải thích của bạn, để viết lại bằng C thì tốt hơn nhiều.
lcc

30

Thêm vào các câu trả lời trước, tôi chỉ muốn nói rằng các phương thức Objective-C (hoặc tin nhắn nếu bạn muốn) có tên tham số bên ngoàibên trong .

Vì vậy, trong trường hợp này:

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

numberOfRowsInComponentlà tên bên ngoài , tên mà bạn sẽ sử dụng khi gọi phương thức này từ bên ngoài.

componentlà tên nội bộ của tham số, tên bạn sử dụng để chỉ tham số từ bên trong phương thức.

Hy vọng rằng sẽ xóa nó một chút.


1
Theo mô tả của bạn, tên phương thức có thể được coi là tên bên ngoài của tham số đầu tiên. Điều này cũng phù hợp với bình luận dưới đây của wilczarz.
Jake

Chết tiệt, tôi thấy câu trả lời này không chính xác. Không có gì giống như một tên bên ngoài / bên trong của các tham số. Đó là TYPE và định danh VARIABLE. Tôi tự hỏi tại sao mọi người rất cố gắng để định nghĩa ObjC là ngôn ngữ tự nhiên, nó rất không tự nhiên theo mọi cách. Đó là một ngôn ngữ, đó là nó, cho phép học nó mà không cần sử dụng các từ ưa thích xung quanh nó.
Siddharth

Đối số có thể có tên nội bộ / bên ngoài. Đúng.
lcc

21

Dường như với tôi rằng chữ ký của phương thức Objective-C giống như câu hơn. Mỗi tham số xứng đáng có một phần trong tên của phương thức. Chẳng hạn, trong C, chúng ta có thể có một phương thức ( setPersonData ) để thiết lập một số thông tin về người:

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

và trong Objective-C, phương thức sẽ mang tính mô tả hơn ( setPersonName: andAge: andHeight :) , như

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

8
Và tại sao setPersonalData (char * andName, int cũngAge, float cũngHeight) không có ý nghĩa? Đó là tất cả về những gì bạn hiểu về cú pháp, không có gì về ý định của các nhà thiết kế objc thông minh ở đây. họ chỉ cần thêm một loạt các cú pháp mà thực sự không có ý nghĩa gì cả .. :)
Siddharth

5
Bạn hiểu nhầm câu trả lời tôi sợ. setPersonalData (char * andName, int cũngAge, float cũngHeight) là một chữ ký, không phải lời gọi. Yêu cầu của chức năng này sẽ là setPersonData ("Tom", 25, 175) - và điều đó không nói lên điều gì nhiều? Lệnh gọi Obj-C sẽ giống như thế này: [person setPersonName: @ "Tom" andAge: 25 andHeight: 175];
wilczarz

3
Bây giờ tôi nghĩ về nó, phản ứng của tôi là một khiếu nại nhiều hơn là một tuyên bố. Tôi không thể đồng ý nhiều hơn.
Siddharth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.