2009-12-16 39 views
18

Bất cứ ai có thể cho tôi biết các dấu ngoặc nhọn "<...>" trong giao diện lớp Obj-C có làm gì không? Như thế này ... http://snipt.net/robhawkes/cocoa-class-interfaceDấu ngoặc nhọn "<…>" trong giao diện lớp Obj-C là gì?

@interface MapMeViewController : UIViewController <CLLocationManagerDelegate, 
      MKReverseGeocoderDelegate, MKMapViewDelegate, UIAlertViewDelegate> { ... } 

Từ quan điểm của tôi họ trông giống như một số loại khai báo kiểu (xem xét kinh nghiệm trước đây của tôi trong PHP và JavaScript), giống như chúng tôi đang làm chắc chắn MapMeViewController là một CLLocationManagerDelegate, MKReverseGeocoderDelegate, MKMapViewDelegate, hoặc UIAlertViewDelegate

Tài liệu về cú pháp @interface dường như không đề cập đến điều này.

Trả lời

35

Dấu ngoặc nhọn trong định nghĩa giao diện lớp cho biết các giao thức mà lớp của bạn tuân thủ.

Giao thức gần giống như giao diện trong Java hoặc C#, với việc bổ sung các phương thức trong giao thức Objective-C có thể là tùy chọn.

Bổ sung trong Mục tiêu-C, bạn có thể khai báo biến, đối số hoặc biến mẫu để phù hợp với một số giao thức. Ví dụ

NSObject<NSCoding, UITableViewDelegate> *myVariable; 

Trong trường hợp này các lớp phải NSObject hoặc một lớp con (chỉ NSProxy và lớp con của nó sẽ thất bại), và nó cũng phải phù hợp với cả hai giao thức NSCodingUITableViewDelegate.

Trong Java hoặc C#, điều này chỉ có thể thực hiện được bằng cách khai báo lớp đã nói.

9

Dấu ngoặc nhọn cho biết protocol. Chúng tương tự như giao diện bằng các ngôn ngữ khác.

4

Tài liệu của Apple báo cáo việc sử dụng dấu ngoặc đơn; xem The Objective-C Programming Language trong chương 4, về "Thông qua một Nghị định thư".

Việc áp dụng giao thức cũng giống như một số cách để khai báo một lớp cha. Cả hai gán phương thức cho lớp. Khai báo superclass gán cho nó các phương thức kế thừa; giao thức gán cho nó các phương thức được khai báo trong danh sách giao thức. Một lớp học được cho là thông qua một giao thức chính quy nếu trong tuyên bố của mình nó liệt kê các giao thức trong dấu ngoặc nhọn sau tên lớp cha:

@interface ClassName : ItsSuperclass < protocol list > 

Categories thông qua giao thức theo cách giống nhau:

@interface ClassName (CategoryName) < protocol list > 
6

Bạn cũng có thể sử dụng chúng trong mã như một diễn viên để cho trình biên dịch biết một đối tượng phù hợp với một giao thức cụ thể.

id <NSFetchedResultsSectionInfo> sectionInfo = [[self.noteFetcher sections] objectAtIndex:section]; 
Các vấn đề liên quan