Objective c 空方法名,这实际上是做什么的?
我目前正在学习objective-c和iOS编程,由于这个微妙的错误,我发现自己被无法工作的代码困住了一个小时。 考虑下面的代码:Objective c 空方法名,这实际上是做什么的?,objective-c,ios,Objective C,Ios,我目前正在学习objective-c和iOS编程,由于这个微妙的错误,我发现自己被无法工作的代码困住了一个小时。 考虑下面的代码: @property (strong, nonatomic) NSString *name; - (NSString *):name { return @"Some name"; } 乍一看(对于任何新手来说),这看起来像是name属性的重写getter。但是有一个非常微妙的:不应该存在。这里没有从编译器/解析器/运行时得到任何警告/错误,所以我的问题是这到底是什么
@property (strong, nonatomic) NSString *name;
- (NSString *):name { return @"Some name"; }
乍一看(对于任何新手来说),这看起来像是name
属性的重写getter。但是有一个非常微妙的:不应该存在。这里没有从编译器/解析器/运行时得到任何警告/错误,所以我的问题是这到底是什么
看到错误后,我试图找到调用此方法的方法,但几次尝试都没有成功。方法签名
-(NSString*):name
分解为以下内容:
它是一个实例方法(而不是带有-
的类方法)+
它返回一个字符串(NSString*)
如果您说出此方法的名称,它将被简单地称为“冒号”<代码>:告诉编译器您的方法也接受一个参数:
有一个名为name的参数李>name
id
,因此此方法实际上充实为-(NSString*):(id)hello
对此方法的有效调用是:[self:@“hello”]
您可以做一些非常奇怪的事情,因为
:
是方法的有效名称,并且编译器假定id
。如果您真的愿意,您可以拥有一个名为-:
的方法。编译器会假定您的意思是-(id):(id):(id):(id)
,一种返回id
类型的对象并接受id
类型的三个参数的方法。您可以这样称呼它:[self:@“hello”:anObject:myObject]代码>像您发布的方法声明一样的方法很少(而且风格很差,依我看)。Objective-C应该是冗长的。方法分解如下:
第一个字符:-
或+
<代码>-
表示它是一个实例方法,+
表示它是一个类方法
(NSString*)
:
。如-(void)重新加载代码>这将是一个不返回值且不接受任何参数的方法李>
如果您的方法采用参数,它们将混合到方法名称中,并且通常会声明类型(与您的示例不同)。例如-(NSString*)reverseString:(NSString*)stringToReverse
在本例中,您的方法名称将是reverseString:
它包含一个参数,NSString*
,该参数将在方法定义中被称为stringtorreverse
通常,如果您看到一个没有类型的:
,它的大小写类似于-(float)addThreeValues:::
此方法返回一个float并接受3个参数。这将是一个合适的定义,因为这三个值与它们提供的顺序无关,因为我们只是在添加它们
+1,简单地说,如果你说出这个方法的名称,它将被简单地称为。。。冒号
。实际上,方法名称是“空字符串”。当说出方法名时,通常不会说冒号,即使它们在那里。。。困惑,我知道。。。但它有点像英语中的“s”。一个停顿或连接符,但不是说出来的。@bbum实际上苹果公司说一个方法的官方说法是说所有的冒号。正在文档中查找该行…感谢您的精确回答。这里的解析器警告会很好。杰克,我很想看看那些文档,因为我会有一根骨头——一个冒号——来选择作者。:)但底线是,名为“:”或“::”的方法肯定会激怒任何有经验的ObjC程序员。