Tôi không thực sự khuyên bạn nên làm điều này, nhưng Mục tiêu-C không giúp bạn có thể mở rộng phương thức setObject:atIndexedSubscript:
bằng mã của riêng bạn. Quá trình này được gọi là "phương pháp nổi loạn" và được giải thích ở đây: http://darkdust.net/writings/objective-c/method-swizzling
Đây là một số mã thực tế thể hiện quá trình này. Các bit mát mẻ là trong main()
, nơi tôi có thể sử dụng fib[-1] = ...
thay vì fib[fib.count] = ...
. Tất nhiên không có lợi thế lớn ở đây; mã không hiệu quả hơn và chắc chắn khó đọc hơn. Nhưng tôi tiết kiệm phải viết ra "fib
" hai lần.
A chính bất lợi của cách tiếp cận này là Mục tiêu-C không thực sự có bất kỳ quy tắc nào về thứ tự các danh mục được tải, vì vậy nếu ai đó cung cấp danh mục có chức năng tương tự, nó sẽ là một cái nào được tải cuối cùng. (Và nếu chúng xảy ra để chọn cùng một tên cho danh mục của chúng, nó sẽ là một thứ mà bạn có thể tải, tôi nghĩ vậy.)
Vì vậy, dòng dưới cùng, đừng làm điều này: nhưng nó có thể là .
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSMutableArray (NegativeOne)
+(void)load;
-(void)swizzled_setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
@end
@implementation NSMutableArray (NegativeOne)
+(void)load
{
Method original = class_getInstanceMethod(self, @selector(setObject:atIndexedSubscript:));
Method swizzled = class_getInstanceMethod(self, @selector(swizzled_setObject:atIndexedSubscript:));
method_exchangeImplementations(original, swizzled);
}
-(void)swizzled_setObject:(id)obj atIndexedSubscript:(NSUInteger)idx
{
if (idx == -1) idx = [self count];
[self swizzled_setObject:obj atIndexedSubscript:idx]; // go use the old method: not a typo!
}
@end
int main()
{
int x = 0, y = 1;
NSMutableArray *fib = [NSMutableArray new];
for (int i=0; i < 10; ++i) {
fib[-1] = @(x); // wowie zowie!
int temp = x+y; x = y; y = temp;
}
NSLog(@"%@", fib);
return 0;
}
Lệnh 'tài liệu NSMutableArray' cho' setObject: atIndexedSubscript: 'explicitely khẳng định: " Nếu chỉ số này bằng 'count' nguyên tố này sẽ được thêm vào cuối mảng, phát triển mảng" –