2015-02-23 39 views
-1

此代碼是從將由Sams斯威夫特書,21章的Song.h文件包含以下代碼:我不明白一個類的Objective-C初始化程序。

//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:

+0

謝謝大家的幫助! – 2015-02-23 23:05:37

回答

1

你幾乎有它正確。

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

接下來是方法簽名的其餘部分,其中可以包含多個參數。每個參數前面都有一個冒號「:」,然後是括號中參數/參數所需的類型,例如: NSString *,最後將遵循將在您通過說明每個參數讀取整個方法名字傳遞價值的內部名稱...

initWithTitle:artist:rating

讀爲一個句子,你說:

「Inititialize樂曲實例與一個標題(這是一個NSString *),藝術家(也一個NSString *),以及一個等級(這需要一個NSNumber *)」

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

instanceTypeid的一個相對較新的替代方案,這意味着返回類型實際上可以是任何東西。這反過來確保它只能是包含該方法的類型的一個實例,在本例中爲Song

至於重複的參數名稱......第一部分「artist:」是調用該方法時出現的外部名稱(如果您使用代碼完成例如,那就是顯示的內容)。參數類型之後的部分(NSString *)artist是將方法的實現內部使用的內部名字。這些可以是相同的,但他們沒有要。

斯威夫特也有類似的結構,但隨着更多的選擇,你可以選擇編寫不同的內部和外部參數名稱,或者只使用1(或使用其值爲機會的輸入參數,使用可以是任意數量元素的可變參數等) - 查看Swift Functions瞭解有關這些主題的更多詳細信息)。

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. 
1

instancetype是用於id更換或特定類型的類通常由init方法返回(事實上編譯器羽用於在編譯時初始化方法idinstancetype),並且不能被其他任何地方使用。它允許編譯器檢查來自該init方法的賦值是否是合適的類型,同時仍允許子類繼承初始值設定項。所以這個init方法很可能會接受初始值並將它們分配給屬性。

1

它是方法的簽名。換句話說..這個方法是如何被命名爲


Btw。 「instancetype」是一個表示實例類型的編譯器關鍵字,實際上該方法將返回一個Song實例。

1

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

至於- (instancetype),減號-意味着它是一個實例方法(類方法開始用加號+),而instancetype是一種方法的返回類型。它只是一個關鍵字,告訴編譯器這個方法將總是返回一個它所調用類的類型的對象。如果您想了解更多信息,我建議您閱讀NSHipster post about instancetype

1

你說:

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

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

兩個(NSString *) s聲明參數將是NSString

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

我認爲馬上第一(NSString *)以下單詞的標題是參數名稱,同樣與繼(NSString *)藝術家。什麼是initWithTitle:artist:

緊隨(NSString *)之後的字是在該方法的實現中使用的參數的名稱。

考慮以下聲明:

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

聲明一個叫做initWithTitle:artist:rating:方法,即有三個參數,一個標題,藝術家和評級。所以,如果你想創建一個名爲「票乘坐」的「甲殼蟲」和等級5首歌,你會調用此方法是這樣的:

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

請修復方法名稱解釋。它有一個非連續的名字,它明確包含了參數的名字。看起來像迅速命名約定:) – 2015-02-23 23:08:49

+0

感謝您指出。 – Rob 2015-02-23 23:56:11

相關問題