tôi đang làm việc trên porting một codebase Java để Cocoa/Objective-C để sử dụng trên máy tính để bàn đang Mac OS X. Java có nhiều và nhiều các phương pháp với những ngoại lệ kiểm tra như:Khi chuyển mã Java sang ObjC, cách tốt nhất để thể hiện các ngoại lệ đã kiểm tra?
double asNumber() throws FooException {
...
}
gì cách tốt nhất để đại diện cho chúng trong Objective-C là gì? Ngoại lệ hoặc lỗi tham số?
- (CGFloat)asNumber {
... // possibly [FooException raise:format:];
}
hoặc
- (CGFloat)asNumberError:(NSError **)outError {
...
}
Tôi có cảm giác rằng ngoài sai sót nói chung là giải pháp tốt hơn cho Objective-C, nhưng khi bạn có thể thấy ... rất nhiều phương pháp như một trong những sẽ ở trên trông khá lúng túng. Và một lần nữa, có lô hàng trong số này.
Dĩ nhiên cần lưu ý rằng vì đây là những kiểm tra trường hợp ngoại lệ trong Java, tôi sẽ cần phải thêm một trong hai @try
khối hoặc if (*outError) {...}
kiểm tra bất cứ nơi nào các phương pháp này được gọi là (nhiều nơi).
Tôi nhớ lại rằng khi nhập @try
khối đã từng đắt tiền trong Mục tiêu-C, giá rẻ ở 64 bit hoặc SL hoặc một số ENV mới khác (không nhớ chính xác). Tôi hoàn toàn không lo lắng về khả năng tương thích ngược, vì vậy tôi là chắc chắn là sẵn sàng chỉ thiết kế cho sự nóng mới.
cho những người sau đây cùng ở nhà, tôi đã quyết định đi với lỗi ngoài và làm theo lời khuyên của Ninncanner của Quinn. vì vậy phương pháp cụ thể này sẽ là một cái gì đó như: '- (BOOL) getNumber: (CGFloat *) outNum lỗi: (NSError **) outErr;' –
@olliej chỉ ra một cách chính xác rằng các khối @try là "zero cost" trong thời gian chạy hiện đại (64-bit và iPhone), nhưng ngoại lệ vẫn còn chi phí khi bạn thực sự ném chúng. Ngoài ra, bạn có thể sử dụng 'double' thay cho' CGFloat' nếu muốn. Đi với bất cứ điều gì là thực hành tốt nhất cho môi trường bạn đang ở và mã bạn tích hợp với. –