Một phần mở rộng lớp mang một số tương đồng vào một danh mục, nhưng nó chỉ có thể được thêm vào một lớp học mà bạn có mã nguồn tại thời gian biên dịch (lớp được biên dịch cùng lúc với phần mở rộng của lớp). Các phương thức được khai báo bởi một phần mở rộng lớp được thực hiện trong khối @implementation cho lớp gốc, vì vậy bạn không thể khai báo một lớp mở rộng trên một lớp khung, chẳng hạn như lớp Cocoa hoặc Cocoa Touch như NSString.
Cú pháp để khai báo một phần mở rộng lớp cũng tương tự như cú pháp cho một thể loại, và trông như thế này:
@interface ClassName()
@end
Bởi vì không có tên được đưa ra trong dấu ngoặc đơn, mở rộng lớp thường được gọi loại như vô danh .
Không giống như các danh mục thông thường, tiện ích mở rộng lớp có thể thêm các thuộc tính và biến mẫu của riêng nó vào một lớp. Nếu bạn khai báo thuộc tính trong tiện ích mở rộng lớp học, như sau:
@interface XYZAnimal() {
id _someCustomInstanceVariable;
}
...
@end
IMHO, tốt nhất nên nghĩ về tiện ích mở rộng lớp là giao diện riêng tư cho một lớp học. Giao diện chính (trong tệp .h) của bạn hoạt động như một giao diện công cộng xác định hợp đồng hành vi của lớp với các lớp khác.
mở rộng Sử dụng lớp để Ẩn thông tin riêng tư
mở rộng lớp thường được sử dụng để mở rộng giao diện công cộng với các phương pháp bổ sung riêng hoặc tài sản để sử dụng trong việc thực hiện các lớp riêng của mình. Ví dụ, thông thường, để xác định thuộc tính là chỉ đọc trong giao diện, nhưng khi ghi đè trong tiện ích mở rộng lớp được khai báo bên trên việc triển khai, để các phương thức nội bộ của lớp có thể thay đổi trực tiếp giá trị thuộc tính.
Ví dụ, lớp XYZPerson có thể thêm thuộc tính được gọi là uniqueIdentifier, được thiết kế để theo dõi thông tin như Số an sinh xã hội ở Hoa Kỳ.
Thường đòi hỏi một số lượng lớn giấy tờ để có một mã định danh duy nhất được gán cho một cá nhân trong thế giới thực, do đó giao diện lớp XYZPerson có thể khai báo thuộc tính này là chỉ đọc và cung cấp một số phương thức yêu cầu mã định danh được gán này:
@interface XYZPerson : NSObject
...
@property (readonly) NSString *uniqueIdentifier;
- (void)assignUniqueIdentifier;
@end
để cho lớp XYZPerson để có thể thay đổi tài sản trong nội bộ, nó làm cho tinh thần để redeclare tài sản trong một phần mở rộng lớp học đó là định nghĩa ở phía trên cùng của tập tin thực thi cho các lớp:
@property (readwrite) NSString *uniqueIdentifier;
Lưu ý: Thuộc tính ghi đè là tùy chọn vì đó là mặc định. Bạn có thể muốn sử dụng nó khi redeclaring một tài sản, cho rõ ràng.
danh mục là mã thực. chúng là cách bạn thêm các đối tượng vào một lớp. các phần mở rộng (theo các thuật ngữ rất chung chung) chỉ là đường cú pháp, để báo hiệu các ý tưởng nhất định về quyền riêng tư, v.v ... cho các lập trình viên khác. các phần mở rộng không chứa mã và không phải là mã. – Fattie
Đối với các tiện ích mở rộng khi chúng được sử dụng trong Swift, hãy xem câu hỏi này: http://stackoverflow.com/questions/24142829/how-to-create-swift-class-for-category – Suragch