此代码来自Sams Teach Yourself Swift一书,第21章.Long.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。我假设紧跟在第一个title
之后的单词(NSString *)
是参数名称,与artist
之后的(NSString *)
相同。什么是initWithTitle:
和artist:
?
答案 0 :(得分:1)
instancetype
是id
的替代(实际上编译器在编译时将id
转换为instancetype
以获取初始化方法)或通常返回的特定类型类init方法,不能在其他任何地方使用。它允许编译器检查来自该init方法的赋值是否是适当的类型,同时仍允许子类继承初始值设定项。所以这个init方法很可能采用初始值并将它们分配给属性。
答案 1 :(得分:1)
这是方法的签名。换句话说..这就是命名的方法。
顺便说一下。 &#34; instancetype&#34;是一个编译器关键字,表示实例的类型,所以实际上该方法将返回一个Song实例。
答案 2 :(得分:1)
- initWithTitle:artist:rating:
是方法的名称,或者是Objective-C术语,选择器。 title
,artist
和rating
是参数名称。
至于- (instancetype)
,减号-
表示它是一个实例方法(类方法以加号+
开头),而instancetype
是返回类型的方法。它只是一个告诉编译器的关键字,这个方法将始终返回一个类的类型对象,在该对象上调用它。如果您想了解更多信息,建议您阅读NSHipster post about instancetype。
答案 3 :(得分:1)
你说:
据我了解,
- (instancetype)
创建了一个实例方法,返回instancetype
。
-
指定实例方法。 instancetype
是一个特殊关键字,指定它返回类的实例,在这种情况下为Song
实例。
两个
(NSString *)
声明参数将是NSString
。
是的,两个(NSString *)
引用表明前两个参数是字符串值。以下(NSNumber *)
表示第三个参数是数字对象。
我假设紧跟在第一个
(NSString *)
之后的单词标题是参数名称,与(NSString *)
之后的艺术家相同。什么是initWithTitle:
和artist:
?
紧跟在(NSString *)
之后的单词是该方法实现中使用的参数的名称。
考虑声明:
- (instancetype)initWithTitle:(NSString *)title artist:(NSString *)artist rating:(NSNumber *)number;
这声明了一个名为initWithTitle:artist:rating:
的方法,它采用三个参数,标题,艺术家和评级。因此,如果您想通过“Beatles”创建一首名为“Ticket to Ride”并且评级为5的歌曲,您可以使用以下内容来调用此方法:
Song *song = [[Song alloc] initWithTitle:@"Ticket to Ride" artist:@"Beatles" rating:@5];
答案 4 :(得分:1)
你几乎是正确的。
Obj-C实例方法以连字符开头,“ - ”后跟括号中的返回类型。一个Class方法,以加号“+”开头,但在其他方面相同。
接下来是方法签名的其余部分,其中可以包含多个参数。每个参数前面都有一个冒号“:”,然后是括号中参数/参数所需的类型,例如: NSString *
,最后是一个将传入的值的内部名称。通过声明每个参数来读取整个方法名称...
initWithTitle:artist:rating
作为一个句子读,你说:
“初始化具有标题(即NSString *)的歌曲实例,艺术家(也是NSString *)和评级(这需要NSNumber *)”
-(returnType)firstPartofMethodNameThatTakestheArgument:(NSString *)argument1 andArgumentTwo:(NSString *)argument2
instanceType
是id
的一个相对较新的选择,这意味着返回类型可以有效地成为任何东西。这反而确保它只能是包含该方法的类型的实例,在本例中为Song
。
关于重复参数名称......第一部分“artist:
是调用方法时出现的外部名称(例如,如果使用代码完成,那就是显示的内容)。参数的类型(NSString *)artist
是将在方法实现中使用的内部名称。它们可以是相同的,但它们不一定是。
Swift有一个类似的结构,但有更多的选项你可以选择编写不同的内部和外部参数名称,或者只使用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.