簡體   English   中英

在Objective-C中使用工廠方法時檢查協議一致性

[英]Checking protocol conformance when using factory methods in Objective-C

最近,我一直在學習如何在Objective-C中使用協議(使用Apple的官方指南),並且在理解我看來是不一致的地方時遇到了麻煩。 在文檔中指出-

通過在屬性上指定所需的協議一致性,即使基本屬性類類型是通用的,如果嘗試將屬性設置為不符合協議的對象,也會收到編譯器警告。

因此,我通過創建一個名為“ XYZFakeProtocol”的協議和一個不符合該協議的類“ XYZPerson”來進行測試。 然后,我嘗試初始化一個預期符合XYZFakeProtocol的通用類變量,如下所示:

id <XYZFakeProtocol> speakingPerson = [[XYZPerson alloc] init];

如預期的那樣,XCode標記錯誤-

使用不兼容類型'XYZPerson *'的表達式初始化'__strong id < XYZFakeProtocol>'

但是,當我做同樣的事情而使用工廠方法而不是手動分配和初始化實例時,錯誤不會出現。 我使用的代碼,其工廠方法為'person:'-

id <XYZFakeProtocol> speakingPerson = [XYZPerson person];

沒有標記任何錯誤,尤其是有問題的是,即使我實際上不在非合格類中,即使調用該方法中指定的方法,也不會出現編譯器錯誤,這會導致程序崩潰。

那么這是Xcode的問題,還是使用工廠方法的預期結果和正確結果?如果是,可以向我解釋其背后的原因,以便我可以理解如何最好地避免這種情況。編寫一個真實的應用程序?

作為參考,如果我創建XYZPerson對象並將其分配給XYZPerson變量,然后將該變量分配給泛型類型變量,則無論我是否使用實例創建實例,Xcode都會正確標記該類不符合協議的錯誤工廠方法或手動初始化-

XYZPerson *helloPerson = [XYZPerson person];
XYZPerson *helloPerson2 = [[XYZPerson alloc] init];
id <XYZFakeProtocol> speakingPerson = helloPerson;
speakingPerson = helloPerson2;

謝謝。

這取決於如何定義XYZPerson類。 如果person返回id ,則類型檢查器會將其視為與任何對象類型兼容。 如果person返回instancetype ,則會收到有關協議一致性的錯誤。

可以安全地假設您已聲明為:

+ (id)person;

更改為:

+ (instancetype)person;

id代表任何類型,因此編譯器不知道返回的對象是否將實現該協議。 instancetype表示該類型的實例,因此編譯器確實知道。

instancetype是一個相對較新的加法,因此編譯器很樂意將其用於init方法。 但是,對於工廠方法,它不願意這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM