2012-11-07 38 views
5

Tại sao phương pháp [NSString stringWithFormat] trả về loại id? Từ tên tôi mong đợi nó trả về một NSString, không phải là một con trỏ chung. Các lớp khác theo "quy tắc" này. Ví dụ: [NSNumber numberWithInt] trả về một số NSNumber, không phải là id.Chuỗi NSStringVới loại trả vềFormat, tại sao lại là "id"?

Tôi nghĩ rằng nó thậm chí không hợp lý từ thực tế là một cái gì đó giống như một phương pháp nhà máy.

+1

Đối với subclassing. 'NSMutableString' sẽ yêu cầu một diễn viên trong trường hợp đó. –

+0

Vâng, tôi đồng ý - bạn có thể thực hiện một điệu nhảy tap xung quanh lý do tại sao nó là cách nó, nhưng cuối cùng nó không có ý nghĩa. –

Trả lời

6

Bạn đề cập đến NSNumber, điều này không có bất kỳ lớp con trực tiếp, vì vậy nó an toàn cho numberWithInt: để trả về một NSNumber*

NSString* (và các lớp khác như NSSet) return loại id vì họ có thể có các lớp con (NSMutableStringNSMutableSet tương ứng), sẽ kế thừa phương pháp này. Như vậy, các cuộc gọi kế thừa này cần trả về một thể hiện của kiểu của lớp con, và do các quy tắc đặt tên phương thức, bạn không thể quá tải dựa trên kiểu trả về một mình. Vì vậy, họ cần một loại chung giữa tất cả, là id.

Cập nhật: Phát triển gần đây có nghĩa là từ khóa instancetype hiện khả dụng. Bạn có thể đã nhận thấy nhiều tham chiếu đến id hiện được thay thế bằng instancetype. Từ khóa này cung cấp gợi ý cho trình biên dịch rằng kiểu trả về của phương thức là cùng một lớp của người nhận phương thức.

Ví dụ (và tôi nhấn mạnh một ví dụ, đây có thể không phải là trường hợp trong khuôn khổ thực tế):

NSArray: 
- (instancetype)initWithArray:(NSArray*)array; 

NSMutableArray: 
// Inherits from NSArray 

---- 

// Receiver is NSArray, method belongs in NSArray, returns an NSArray 
[[NSArray alloc] initWithArray:@[]]; 

// Receiver is NSMutableArray, method belongs in NSArray, returns an NSMutableArray 
[[NSMutableArray alloc] initWithArray:@[]]; 
+0

Ok, tôi không bao giờ nghĩ rằng tôi có thể gọi [NSMutableString stringWithFormat]. Thông thường tôi xây dựng một NSMutableString rỗng và sau đó thêm định dạng. Sự hiểu biết của tôi về phân cấp lớp là thiên vị từ kinh nghiệm Java, nơi String không phải là một lớp siêu của StringBuilder. – giampaolo

+0

Phiên bản có thể thay đổi của một lớp luôn là lớp con của đối tác cụ thể. Nó có ý nghĩa đối với Cocoa, lớp có thể thay đổi giống với lớp bê tông, với một vài chuông và còi được thêm vào để cho phép nó được ghi đè, thay vì chỉ đọc: – WDUK

+0

@WDUK là cầu kỳ, 'NSNumber' là một cụm lớp, vì vậy nó có rất nhiều lớp con, chỉ riêng chúng. –

5

Bởi vì nó là một phương pháp tĩnh trên lớp NSString và được giả định là trả về kiểu đối tượng đang được gọi. Điều này cũng phụ thuộc vào loại vì điều này có thể đến từ một NSMutableString.

Các vấn đề liên quan