空方法名称,这实际上是做什么?
我目前正在学习自己的objective-c和iOS编程,并发现自己由于这个微妙的错误一小时卡住非工作代码。 考虑下面的代码:
@property (strong, nonatomic) NSString *name; - (NSString *):name { return @"Some name"; }
乍一看(对于任何新的),这看起来像是一个重写的name
属性getter。 但是一个非常微妙的:那不应该在那里。 你从编译器/parsing器/运行时没有警告/错误在这里,所以我的问题是什么这实际上最终?
一旦我看到错误,我试图找出调用这个方法的方法,但是在我的几次尝试中都没有成功。
方法签名- (NSString *):name
分解为以下内容:
-
-
这是一个实例方法(与带有+
的类方法相比)。 -
(NSString *)
它返回一个string。 -
:
如果你要说出这个方法的名字,那简直就叫做“冒号”。:
告诉编译器你的方法也接受一个参数。 -
name
有一个名为参数。
当你不指定一个types时,编译器假设你是指id
,所以这个方法实际上是充实的- (NSString *):(id)hello
对这个方法的有效调用是: [self :@"hello"]
。
你可以做很奇怪的事情,因为:
是一个方法的有效名称,编译器假定id
。 你可以,如果你真的想要,有一个方法叫- :::
。 编译器会假定你的意思是- (id):(id):(id):(id)
,这个方法返回一个id
types的对象,并接受三个id
types的参数。 你会这样调用它: [self :@"hello" :anObject :myObject];
一个方法声明像你发布的是罕见的(和风格差,imo)。 Objective-C应该是冗长的。 方法如下所示:
- 第一个字符:或者
-
或者+
。-
表示它是一个实例方法,+
表示它是一个类方法。 - 括号中的值:方法的返回types。 在你的例子中,该方法返回一个
(NSString *)
。 - 其余(大括号之前)是方法名称以及它们所带的参数。 你可以有一个没有参数的名字,在这种情况下,方法名不会有
:
in。 如- (void) reload;
这将是一个方法,不会返回一个值,不带参数。 - 如果你的方法需要参数,它们将被混合到方法名称中,通常会声明types(不像你的例子)。 如
- (NSString *) reverseString:(NSString *) stringToReverse;
在这个例子中,你的方法名是reverseString:
它需要一个参数,一个NSString*
,在方法定义中被称为stringToReverse
。 - 通常情况下,如果你看到一个
:
没有types的情况下会像- (float) addThreeValues:::
这个方法返回一个浮点数,并带有3个参数。 这将是一个合适的定义,因为三个值并不重要,因为我们只是添加它们。