NS chung có thể được thực hiện bằng cách phân lớp NSArray
và xác định lại tất cả các phương pháp được cung cấp với các phương thức hạn chế hơn. Ví dụ,
- (id)objectAtIndex:(NSUInteger)index
sẽ phải được định nghĩa lại trong
@interface NSStringArray : NSArray
như
- (NSString *)objectAtIndex:(NSUInteger)index
cho một NSArray chứa chỉ NSStrings.
Lớp con được tạo có thể được sử dụng như là một thay thế thả và mang lại nhiều tính năng hữu ích: cảnh báo trình biên dịch, quyền truy cập thuộc tính, tạo mã tốt hơn và -hoàn toàn trong Xcode. Tất cả đều là các tính năng biên dịch-thời gian, không cần phải xác định lại việc thực hiện thực tế - các phương thức của NSArray vẫn có thể được sử dụng.
Có thể tự động hóa điều này và đun sôi xuống chỉ hai câu lệnh, điều này mang lại cho nó gần với các ngôn ngữ hỗ trợ Generics. Tôi đã tạo tự động hóa với WMGenericCollection, nơi các mẫu được cung cấp dưới dạng Macro tiền xử lý C.
Sau khi nhập tệp tiêu đề chứa macro, bạn có thể tạo một NSArray chung với hai câu lệnh: một cho giao diện và một cho việc triển khai. Bạn chỉ cần cung cấp kiểu dữ liệu bạn muốn lưu trữ và tên cho các lớp con của bạn. WMGenericCollection cung cấp các mẫu như vậy cho NSArray
, NSDictionary
và NSSet
cũng như các đối tác có thể thay đổi của chúng.
Một ví dụ: List<int>
có thể được thực hiện bởi một lớp tùy chỉnh được gọi NumberArray
, được tạo ra với các tuyên bố sau đây:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Khi bạn đã tạo NumberArray
, bạn có thể sử dụng nó ở khắp mọi nơi trong dự án của bạn. Nó thiếu cú pháp của <int>
, nhưng bạn có thể chọn lược đồ đặt tên của riêng bạn để gắn nhãn chúng dưới dạng các lớp làm mẫu.
Chỉ mới bắt đầu tìm hiểu về ObjC. Có lẽ bạn có thể sử dụng ObjC++ để thực hiện việc nâng hạng nặng? – Toybuilder
ObjC++ không thực sự là một ngôn ngữ ... chỉ là một cách để tham khảo khả năng của ObjC để xử lý C++ inline giống như nó sẽ xử lý C.Bạn không nên làm điều này trừ khi bạn phải, mặc dù (chẳng hạn như nếu bạn cần sử dụng thư viện của bên thứ ba được viết bằng C++). –
Khá nhiều bản sao chính xác của http://stackoverflow.com/questions/649483/is-there-any-way-to-enforce-typing-on-nsarray-nsmutablearray-etc –