Làm cách nào để vượt qua nhiều tham số trong Objective-C?


178

Tôi đã đọc một số bài đăng về cú pháp phương pháp Objective-C nhưng tôi đoán tôi không hiểu nhiều tên cho một phương thức.

Tôi đang cố gắng tạo một phương thức được gọi getBusStopsvới NSStringNSTimeIntervalcác tham số và kiểu trả về NSMutableArray. Đây là cách tôi đã xây dựng phương thức nhưng rõ ràng nó bị lỗi khi chạy:

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

Tôi thấy một ví dụ khác với một phương thức:

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

Tôi không hiểu tại sao phương thức này có tên phương thức cho từng tham số. Tôi có nên làm tương tự với một cái gì đó như:

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

Câu trả lời:


120

Objective-C không có các tham số được đặt tên, vì vậy mọi thứ ở phía bên trái của dấu hai chấm là một phần của tên phương thức. Ví dụ,

getBusStops: forTime:

là tên của phương thức. Tên được chia nhỏ để có thể mô tả nhiều hơn. Bạn chỉ có thể đặt tên cho phương pháp của bạn

getBusStops: :

nhưng điều đó không cho bạn biết nhiều về tham số thứ hai.


157

Bạn cần phân cách tối thiểu từng tên tham số bằng ":". Về mặt kỹ thuật, tên này là tùy chọn, nhưng nó được khuyến khích để dễ đọc. Vì vậy, bạn có thể viết:

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

hoặc những gì bạn đề xuất:

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

15
+1: Đối số chức năng Objective-C thực sự là vị trí, không được đặt tên, vì vậy nhãn là tùy chọn và dành cho con người.
Jarret Hardie

không chắc chắn tại sao "forTime" được ưu tiên trong chữ ký, "timeInterval" có thể được sử dụng làm tham số thứ 2 trong hàm, phải không?
galactica

@galactica - Chắc chắn, tên có thể là bất cứ điều gì có ý nghĩa nhất đối với bạn. Ví dụ này sử dụng thuật ngữ của OP để thống nhất.
EM

2
Vẫn không chắc chắn những gì được forTimesử dụng cho?
mrgloom

71

Đúng; cú pháp phương thức Objective-C giống như vậy vì một vài lý do; một trong số đó là để rõ ràng các tham số bạn đang chỉ định là gì. Ví dụ: nếu bạn đang thêm một đối tượng NSMutableArrayvào một chỉ mục nhất định, bạn sẽ thực hiện nó bằng phương thức:

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

Phương thức này được gọi insertObject:atIndex:và rõ ràng là một đối tượng đang được chèn tại một chỉ mục được chỉ định.

Trong thực tế, thêm một chuỗi "Xin chào, Thế giới!" tại chỉ số 5 của một cuộc NSMutableArraygọi arraysẽ được gọi như sau:

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

[array insertObject:obj atIndex:index];

Điều này cũng làm giảm sự mơ hồ giữa thứ tự của các tham số phương thức, đảm bảo rằng bạn vượt qua tham số đối tượng trước, sau đó là tham số chỉ mục. Điều này trở nên hữu ích hơn khi sử dụng các hàm có số lượng lớn đối số và giảm lỗi khi truyền đối số.

Hơn nữa, quy ước đặt tên phương thức là như vậy bởi vì Objective-C không hỗ trợ quá tải; tuy nhiên, nếu bạn muốn viết một phương thức thực hiện cùng một công việc, nhưng có các kiểu dữ liệu khác nhau, điều này có thể được thực hiện; lấy ví dụ, NSNumberlớp học; điều này có một số phương thức tạo đối tượng, bao gồm:

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

Trong một ngôn ngữ như C ++, bạn chỉ cần quá tải phương thức số để cho phép các kiểu dữ liệu khác nhau được truyền làm đối số; tuy nhiên, trong Objective-C, cú pháp này cho phép thực hiện một số biến thể khác nhau của cùng một chức năng, bằng cách thay đổi tên của phương thức cho từng biến thể của hàm.


tên tham số được yêu cầu trong khi gọi phương thức (gửi tin nhắn) nếu tên hàm bao gồm tên tham số?
Naveen

24

Văn bản trước mỗi tham số là một phần của tên phương thức. Từ ví dụ của bạn, tên của phương thức thực sự là

-getBusStops:forTime:

Mỗi: đại diện cho một đối số. Trong một cuộc gọi phương thức, tên phương thức được phân chia tại: s và các đối số xuất hiện sau dấu: seg

[getBusStops: arg1 forTime: arg2]

3
Tôi nghĩ bạn đã quên thêm tên của phương thức.
Özgür

11

để tạo phương thức:

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

để gọi phương thức:

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

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

tôi:

(returnTypeOfSecontArgument) secondArgumentName ;

như trong các ngôn ngữ khác, chúng tôi sử dụng cú pháp sau void add(int one, int second) nhưng cách gán đối số trong OBJ_cthì khác như mô tả ở trên

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.