Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 空方法名,这实际上是做什么的?_Objective C_Ios - Fatal编程技术网

Objective c 空方法名,这实际上是做什么的?

Objective c 空方法名,这实际上是做什么的?,objective-c,ios,Objective C,Ios,我目前正在学习objective-c和iOS编程,由于这个微妙的错误,我发现自己被无法工作的代码困住了一个小时。 考虑下面的代码: @property (strong, nonatomic) NSString *name; - (NSString *):name { return @"Some name"; } 乍一看(对于任何新手来说),这看起来像是name属性的重写getter。但是有一个非常微妙的:不应该存在。这里没有从编译器/解析器/运行时得到任何警告/错误,所以我的问题是这到底是什么

我目前正在学习objective-c和iOS编程,由于这个微妙的错误,我发现自己被无法工作的代码困住了一个小时。 考虑下面的代码:

@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程序员。