繁体   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