我不懂班级的Objective-C初始化程序。

时间:2015-02-23 22:44:41

标签: objective-c nsstring initializer

此代码来自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:

5 个答案:

答案 0 :(得分:1)

instancetypeid的替代(实际上编译器在编译时将id转换为instancetype以获取初始化方法)或通常返回的特定类型类init方法,不能在其他任何地方使用。它允许编译器检查来自该init方法的赋值是否是适当的类型,同时仍允许子类继承初始值设定项。所以这个init方法很可能采用初始值并将它们分配给属性。

答案 1 :(得分:1)

这是方法的签名。换句话说..这就是命名的方法。


顺便说一下。 &#34; instancetype&#34;是一个编译器关键字,表示实例的类型,所以实际上该方法将返回一个Song实例。

答案 2 :(得分:1)

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

至于- (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

instanceTypeid的一个相对较新的选择,这意味着返回类型可以有效地成为任何东西。这反而确保它只能是包含该方法的类型的实例,在本例中为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.