2009-04-06 21 views
155

Tôi đã đọc một số bài viết 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 pháp.Làm cách nào để chuyển nhiều tham số trong Objective-C?

Tôi đang cố gắng tạo phương thức có tên là getBusStops với thông số NSStringNSTimeInterval và kiểu trả lại là NSMutableArray. Đây là cách tôi đã xây dựng phương pháp này nhưng nó rõ ràng là 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 pháp:

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

Tôi không hiểu tại sao phương pháp này có một cái tên phương pháp cho mỗi 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 

Trả lời

102

Objective-C không có tên thông số, vì vậy tất cả 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 pháp. Ví dụ:

getBusStops: forTime: 

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

getBusStops: : 

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

137

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

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

hoặc những gì bạn đề nghị:

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

1: đối số chức năng Objective-C có thực sự vị trí, không có tên, do đó nhãn là tùy chọn và cho con người. –

61

Có; cú pháp phương pháp Objective-C là như thế này vì một vài lý do; một trong số này 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 đến một NSMutableArray tại một chỉ số nhất định, bạn sẽ làm điều đó bằng phương pháp:

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

Phương pháp này được gọi là insertObject:atIndex: và rõ ràng là một đối tượng đã được chèn vào một quy định mục lục.

Thực tế, thêm chuỗi "Hello, World!" tại chỉ số 5 của một NSMutableArray gọi array sẽ được gọi như sau:

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

[array insertObject:obj atIndex:index]; 

này cũng làm giảm sự nhập nhằng giữa thứ tự của các thông số phương pháp, đảm bảo rằng bạn vượt qua các tham số đối tượng đầu tiên, sau đó 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 lấy một số lượng lớn đối số và làm giảm lỗi khi truyền các đối số.

Hơn nữa, quy ước đặt tên phương thức là như vậy 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ụ, lớp NSNumber; này có một số phương pháp 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 sẽ chỉ đơn giản là quá tải các phương pháp số để cho phép các kiểu dữ liệu khác nhau để được thông qua làm đối số; tuy nhiên, trong Objective-C, cú pháp này cho phép một số biến thể khác nhau của cùng một hàm được thực hiện, bằng cách thay đổi tên của phương thức cho mỗi biến thể của hàm.

+0

là tên thông số cần thiết 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

23

Văn bản trước mỗi thông số là phần của tên phương thức. Từ ví dụ của bạn, tên của phương pháp thực tế 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 tách tại: s và các đối số xuất hiện sau: s. ví dụ.

[getBusStops: arg1 forTime: arg2] 
+3

Tôi nghĩ bạn quên thêm tên của phương thức. –

4

cho tạo phương pháp:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second { } 

cho gọi các phương pháp:

[mymethod:self.contoCorrente withsecond:self.asecond]; 
-2
(int) add: (int) numberOne plus: (int) numberTwo ; 
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa 

tôi:

(returnTypeOfSecontArgument) secondArgumentName ; 

như trong oth er ngôn ngữ chúng ta sử dụng cú pháp sau trống add(int one, int second) nhưng cách gán đối số trong OBJ_c là khác nhau như mô tả ở trên

Các vấn đề liên quan