我不明白一个类的Objective-C初始化程序。

问题描述:

此代码是从将由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

你几乎有它正确。

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. 

instancetype是用于id更换或特定类型的类通常由init方法返回(事实上编译器羽用于在编译时初始化方法idinstancetype),并且不能被其他任何地方使用。它允许编译器检查来自该init方法的赋值是否是合适的类型,同时仍允许子类继承初始值设定项。所以这个init方法很可能会接受初始值并将它们分配给属性。

它是方法的签名。换句话说..这个方法是如何被命名为


Btw。 “instancetype”是一个表示实例类型的编译器关键字,实际上该方法将返回一个Song实例。

- initWithTitle:artist:rating:是方法的名称,或者是Objective-C术语中的选择器。 titleartistrating是参数名称。

至于- (instancetype),减号-意味着它是一个实例方法(类方法开始用加号+),而instancetype是一种方法的返回类型。它只是一个关键字,告诉编译器这个方法将总是返回一个它所调用类的类型的对象。如果您想了解更多信息,我建议您阅读NSHipster post about instancetype

你说:

据我了解,在- (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