簡體   English   中英

我不了解類的Objective-C初始化程序。

[英]I do not understand Objective-C Initializer for a class.

此代碼摘自Sams Teach Yourself Swift書,第21章。Song.h文件包含以下代碼:

//Song.h
#import <Foundation/Foundation.h>
@interface Song : NSObject;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *artist;
@property (nonatomic, strong) NSNumber *rating;
- (instancetype)initWithTitle:(NSString *)title artist:(NSString *)artist rating:(NSNumber *)number;
@end

據我了解, - (instancetype)創建一個實例方法,返回一個instancetype 兩個(NSString *)聲明該參數將為NSString。 我假設緊跟在第一個(NSString *)之后的單詞title是參數名稱,與(NSString *)之后的artist相同。 什么是initWithTitle:artist:

instancetype替代id (實際上,編譯器在編譯時將id轉換為init方法的instancetype )或通常由init方法返回的特定類型類,並且不能在其他任何地方使用。 它允許編譯器檢查該init方法的賦值是否是適當的類型,同時仍然允許子類繼承初始化程序。 因此,此init方法很可能采用初始值並將其分配給屬性。

它是方法的簽名 換句話說,..方法就是這樣命名的


順便說一句。 “ instancetype”是一個編譯器關鍵字,代表實例的類型,因此實際上該方法將返回Song實例。

- initWithTitle:artist:rating:是方法的名稱,或者用Objective-C的術語來說是選擇器。 titleartistrating是參數名稱。

至於- (instancetype) ,減號-表示它是一個實例方法(類方法以加號+開頭),而instancetype是方法的返回類型。 它只是一個關鍵字,告訴編譯器此方法將始終返回調用它的類類型的對象。 如果您想了解更多信息,我建議閱讀有關instancetypeNSHipster帖子

你說:

據我了解, - (instancetype)創建一個實例方法,返回一個instancetype

-指定實例方法。 instancetype是一個特殊的關鍵字,它指定它返回類的實例,在這種情況下為Song實例。

這兩個(NSString *)聲明該參數將為NSString

是的,兩個(NSString *)引用指示前兩個參數是字符串值。 以下(NSNumber *)指示第三個參數是數字對象。

我假設緊跟在第一個(NSString *)之后的單詞title是參數名稱,與(NSString *)之后的藝術家相同。 什么是initWithTitle:artist:

(NSString *)之后的單詞是該方法的實現中使用的參數名稱。

考慮一下聲明:

- (instancetype)initWithTitle:(NSString *)title artist:(NSString *)artist rating:(NSNumber *)number;

這將聲明一個名為initWithTitle:artist:rating: ,該方法帶有三個參數:標題,藝術家和等級。 因此,如果您想通過“甲殼蟲”創建一首名為“ Ticket to Ride”的歌曲,並將其等級定為5,則可以使用以下方法調用此方法:

Song *song = [[Song alloc] initWithTitle:@"Ticket to Ride" artist:@"Beatles" rating:@5];

您幾乎正確了。

Obj-C實例方法以連字符“-”開頭,后跟括號中的返回類型。 Class方法以加號“ +”開頭,但其他方面相同。

接下來是方法簽名的其余部分,其中可以包括多個參數。 每個參數都以冒號“:”開頭,然后是括號中的參數/參數的必需類型,例如NSString * ,最后是將要傳入的值的內部名稱。說明每個參數...

initWithTitle:artist:rating

閱讀作為一句話,你說的是:

“使用標題(是NSString *),藝術家(也是NSString *)和評分(這需要NSNumber *)來初始化Song實例”

-(returnType)firstPartofMethodNameThatTakestheArgument:(NSString *)argument1 andArgumentTwo:(NSString *)argument2

instanceTypeid一個相對較新的替代方法,這意味着返回類型可以有效地是任何值。 而是確保它只能是包含該方法的類型的實例,在本例中為Song

至於重復的參數名稱...第一部分“ artist:是調用該方法時出現的外部名稱(例如,如果使用代碼完成,則顯示該名稱)。參數類型之后的部分(NSString *)artist是將在方法實現中使用的內部名稱。這些名稱可以相同,但不必相同。

Swift具有類似的構造,但是具有更多選項,您可以選擇編寫不同的內部和外部參數名稱,或者僅使用1(或使用值可能會出現的in-out參數,使用可以是任意數量元素的可變參數,等等-有關這些主題的更多詳細信息,請查看Swift 函數

func initWith(externalTitle internalTitle:String, #artist:String, #rating:Int) -> Song 

//When calling, you'd see "externalTitle:artist:rating" 
//but in the method implementation you'd use "internalTitle" instead.

暫無
暫無

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

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