2012-02-20 38 views
8

Ý tưởng của tôi rất giống với việc khai báo một biến kiểu giao diện trong java.Tôi có thể khai báo một biến kiểu 'giao thức' trong giao diện Objective-C không?

Vì vậy, ví dụ,

phần đầu tập tin 1:

@protocol Calculator 

@end 

sau đó tôi xác định một @interface CalculatorImpl mà thực hiện các Calculator giao thức trên.

Trong phần đầu tập tin 2:

@interface SomeViewController : UIViewController { 


} 

@property (weak, nonatomic) IBOutlet UITextField *txtResult; 
@property (weak, nonatomic) Calculator* calculator; 

@end 

Tuy nhiên, xcode chí cờ một lỗi tại dòng máy tính

property with 'weak' attribute must be of object type 

Được sử dụng này của giao thức không được công nhận bởi khách quan-c?

Trả lời

18

A @protocol không phải là loại để bạn không thể sử dụng loại này cho loại @property.

Những gì bạn có thể muốn làm thay vì đây là:

@property (weak, nonatomic) id <Calculator> calculator; 

này tuyên bố một tài sản không có hạn chế về loại hình của nó, ngoại trừ việc nó phù hợp với các giao thức Calculator.

+0

Làm cách nào để bạn tạo thuộc tính mà không bị hạn chế về loại hình nhanh chóng, bằng cách đặt nó để nhập anyobject? – Chris

4

Bạn nên sử dụng

@property (weak, nonatomic) id <Calculator> calculator; 

Trong Objective-C bạn không thể khởi tạo một giao thức, bạn chỉ có thể phù hợp với nó. Do đó, thay vì có một đối tượng kiểu Calculator, bạn nên có một đối tượng chung phù hợp với giao thức Calculator.

Nếu không, bạn có thể sử dụng

@property (weak, nonatomic) CalculatorImpl* calculator; 

từ CalculatorImpl là một giao diện, không phải là một giao thức.

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