[英]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.