[英]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的術語來說是選擇器。 title
, artist
和rating
是參數名稱。
至於- (instancetype)
,減號-
表示它是一個實例方法(類方法以加號+
開頭),而instancetype
是方法的返回類型。 它只是一個關鍵字,告訴編譯器此方法將始終返回調用它的類類型的對象。 如果您想了解更多信息,我建議閱讀有關instancetype的NSHipster帖子 。
你說:
據我了解,
- (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
instanceType
是id
一個相對較新的替代方法,這意味着返回類型可以有效地是任何值。 而是確保它只能是包含該方法的類型的實例,在本例中為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.