Tôi cố gắng biên dịch, nhưng mỗi lần tôi biên dịch, một trong các phương thức lại đưa ra lỗi "Loại dự kiến" kỳ lạ. Tôi có một phương pháp trong tiêu đề:
-(ANObject *)generateSomethingForSomethingElse:(NSString *)somethingElse;
Lỗi chỉ ra kiểu trả về của phương thức này. tôi đã sử dụng #nhập "ANObject.h"
Sẽ Đối tượng
Nhập vào tiêu đề và Đối tượng
Biên soạn tốt ..
Tại sao điều này lại xảy ra?
Điều này liên quan đến thứ tự biên dịch các tệp nguồn. Có thể bạn đã biết rằng bạn không thể gọi một phương thức trước khi nó được xác định (xem mã giả bên dưới):
giá trị var = someMethod();
hàm someMethod()
{
...
}
Điều này sẽ gây ra lỗi thời gian biên dịch vì someMethod() chưa được xác định. Các lớp học cũng vậy. Các lớp được biên dịch lần lượt bởi trình biên dịch.
Vì vậy, nếu bạn tưởng tượng việc đặt tất cả các lớp của mình vào một tệp lớn trước khi biên dịch, bạn có thể đã thấy vấn đề. chúng ta hãy xem Tàu thủy
Và Bến thuyền
loại:
@interface BoatYard: NSObject
@property (không nguyên tử, giữ lại) Ship* currentShip;
@kết thúc
@interface Gửi : NSObject
@property (không phải nguyên tử, giữ nguyên) NSString* tên;
@property (không phải nguyên tử, gán) trọng số float;
@kết thúc
Một lần nữa, bởi vì Tàu thủy
Lớp chưa được xác định, chúng tôi chưa thể tham chiếu nó. Việc khắc phục sự cố cụ thể này rất đơn giản; thay đổi thứ tự biên dịch và biên dịch. Tôi chắc chắn bạn đã quen với màn hình này trong XCode:
Nhưng bạn có biết bạn có thể kéo file lên và xuống danh sách không? Điều này thay đổi thứ tự các tập tin được biên dịch. Vì vậy, chỉ cần thay đổi Tàu thủy
lớp chuyển đến Bến thuyền
Ở trên lớp, mọi thứ đều ổn.
Nhưng nếu bạn không muốn làm điều này, hoặc quan trọng hơn, nếu có mối quan hệ tuần hoàn giữa hai đối tượng thì sao? Hãy làm điều này bằng cách thêm cặp Tàu thủy
vị trí hiện tại Bến thuyền
tham chiếu để tăng độ phức tạp của biểu đồ đối tượng:
@interface BoatYard: NSObject
@property (không nguyên tử, giữ lại) Ship* currentShip;
@kết thúc
@interface Gửi : NSObject
@property (không nguyên tử, giữ nguyên) BoatYard* currentBoatYard;
@property (không phải nguyên tử, giữ nguyên) NSString* tên;
@property (không phải nguyên tử, gán) trọng số float;
@kết thúc
Ôi chúa ơi, bây giờ chúng ta có một vấn đề. Hai cái này không thể được biên dịch cạnh nhau. Chúng ta cần một cách để thông báo cho trình biên dịch rằng lớp Ship* thực sự tồn tại. đây là @lớp học
Lý do tại sao từ khóa rất thuận tiện.
Theo cách nói thông thường, bạn đang nói: “Hãy tin tôi,Tàu thủy
Nó tồn tại và bạn sẽ sớm thấy nó." Tóm lại:
@lớp Tàu;
@interface BoatYard: NSObject
@property (không nguyên tử, giữ lại) Ship* currentShip;
@kết thúc
@interface Gửi : NSObject
@property (không nguyên tử, giữ nguyên) BoatYard* currentBoatYard;
@property (không phải nguyên tử, giữ nguyên) NSString* tên;
@property (không phải nguyên tử, gán) trọng số float;
@kết thúc
Trình biên dịch hiện đang biên dịch Bến thuyền
biết khi nàoTàu thủy
Định nghĩa lớp sẽ sớm xuất hiện. Tất nhiên, nếu không thì việc biên dịch vẫn thành công.
@lớp học
Tất cả những gì từ khóa làm là thông báo cho trình biên dịch rằng lớp đó sẽ sớm xuất hiện. NóKHÔNG #nhập khẩu
các lựa chọn thay thế. Bạn vẫn phải nhập tệp tiêu đề, nếu không bạn sẽ không thể truy cập bất kỳ nội dung nào của lớp:
@lớp Tàu
-(void) ví dụ
{
Ship* newShip = [[Phân bổ tàu] khởi tạo];
}
Điều này không hoạt động và không thành công với thông báo lỗi cho biết Ship là một tuyên bố chuyển tiếp. một khi bạn#import "Ship.h"
, bạn có thể tạo một thể hiện của đối tượng.
Tôi là một lập trình viên xuất sắc, rất giỏi!