2013-05-08 36 views
2

這是否有效的語法?符合協議的類 - 編譯時檢查

@property (nonatomic, strong) Class<SomeProtocol> myClass; 

SomeProtocol定義爲:

@protocol SomeProtocol <NSObject> 

@required 
+ (BOOL)isAllowed; 

@end 

欲執行編譯時檢查,使得當使用不實現所要求的isAllowed方法的類(UIViewController例如)編譯器會抱怨爲myClass財產。

P.S.當我傳入不符合SomeProtocol協議的類時,不會收到編譯器警告或錯誤。

+1

'@property(nonatomic,strong)id myClass;'這是有效的&經常使用 – 2013-05-08 07:27:54

+1

問題是關於Class 而不是id 。 – pshah 2013-05-08 16:06:11

回答

4

它在語法上是有效的,但正如您發現的那樣,它只會檢查發送對象的消息,如果傳入不合格的類,則不會發出警告。原因是所有類的靜態類型只是Class,這是一個動態類型† - 就像您可以將id分配給任何對象類型的變量一樣,您可以將Class分配給任何Class變量。

†注意:要清楚,這不是術語「動態類型」的技術用法。我不知道idClass是否有一個正常的短語。我認爲它在上下文中應該很清楚,但我用它來指代它告訴編譯器不要爲該對象聲明靜態類型,因此這種類型在Ruby或Python中是動態的。

+0

謝謝!有沒有辦法強制執行這樣的編譯時檢查? – pshah 2013-05-08 16:07:04

+0

@pshah:我不這麼認爲。核心問題是任何返回類的方法或函數都會返回類型'Class',類型檢查者認爲它與任何其他'Class'兼容。這與返回'id'的方法是一樣的 - 你不能對它們實施靜態類型約束,因爲'id'或'Class'的意思是「直到運行時才知道實際類型」。 – Chuck 2013-05-08 17:05:17