Tôi đã nhìn thấy việc sử dụng các giao thức Objective-C sẽ được sử dụng trong một thời trang như sau:Làm thế nào để xử lý các giao thức Objective-C có chứa các thuộc tính?
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Tôi đã nhìn thấy định dạng này sử dụng thay vì viết một lớp cha bê tông mà lớp con mở rộng. Câu hỏi đặt ra là, nếu bạn tuân theo giao thức này, bạn có cần tự tổng hợp các thuộc tính không? Nếu bạn đang mở rộng một siêu lớp, câu trả lời rõ ràng là không, bạn không cần phải. Nhưng làm thế nào để đối phó với các thuộc tính mà một giao thức yêu cầu phải tuân theo?
Để hiểu biết của tôi, bạn vẫn cần phải khai báo các biến cá thể trong tệp tiêu đề của một đối tượng tuân theo giao thức yêu cầu các thuộc tính này. Trong trường hợp đó, chúng ta có thể giả định rằng chúng chỉ là một nguyên tắc hướng dẫn? CLearly giống nhau không phải là trường hợp cho một phương pháp cần thiết. Trình biên dịch sẽ tát cổ tay của bạn để loại trừ một phương thức được yêu cầu mà một giao thức liệt kê. Câu chuyện đằng sau tài sản là gì?
Dưới đây là một ví dụ mà tạo ra một lỗi biên dịch (Lưu ý: Tôi đã tỉa mã mà không suy ngẫm về vấn đề trong tầm tay):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end
Đối với các thuộc tính được xác định trong giao thức, bạn vẫn cần "@synthesize" ngay cả trong thời gian chạy hiện đại hoặc bạn cần sao chép "@property" trong định nghĩa giao diện của mình để tự động tổng hợp. –
@JeffreyHarris Còn về Swift thì sao? –
@KaranAlangat - không có thứ gì như \ @ intnthesize trong Swift, nhưng cũng giống như ObjC bạn cần khai báo thuộc tính trong lớp yêu cầu tuân theo giao thức. Trong Swift, bạn có thể tạo một thể loại định nghĩa một thực thi mặc định của một hàm, nhưng theo như tôi đã có thể nói với bạn thì không thể có một thuộc tính mặc định cho một giao thức. –