10

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

@property (strong, nonatomic) NSString *name;
- (NSString *):name { return @"Some name"; }

乍一看(对于任何新人来说),这看起来像是该name属性的一个被覆盖的吸气剂。但是有一个非常微妙的那不应该在那里。您在这里没有从编译器/解析器/运行时收到警告/错误,所以我的问题是这实际上最终是什么?

看到错误后,我试图想出一种调用此方法的方法,但在我的几次尝试中都没有成功。

4

2 回答 2

13

方法签名- (NSString *):name分解为以下内容:

  • -它是一个实例方法(相对于带有 的类方法+)。
  • (NSString *)它返回一个字符串。
  • :如果你要说出这种方法的名称,它会被简单地称为“冒号”。:告诉编译器你的方法也接受一个参数。
  • name有一个参数叫做name。

当您不指定类型时,编译器会假定您的意思是id,因此此方法实际上充实为- (NSString *):(id)hello

对此方法的有效调用是:[self :@"hello"].

您可以做一些非常奇怪的事情,因为:它是方法的有效名称,并且编译器假定id. 如果你真的想的话,你可以有一个名为- :::. 编译器会假定您的意思- (id):(id):(id):(id)是返回一个类型对象id并采用三个类型参数的方法id。你会这样称呼它:[self :@"hello" :anObject :myObject];

于 2012-04-27T22:45:44.540 回答
3

像您发布的那样声明的方法很少见(而且风格很差,imo)。Objective-C 应该是冗长的。方法分解如下:

  1. 第一个字符:要么-+-表示它是实例方法,+表示它是类方法。
  2. 括号中的值:方法的返回类型。在您的示例中,该方法返回一个(NSString *).
  3. 其余部分(在花括号之前)是方法名称以及它们采用的任何参数。您可以有一个没有参数的名称,在这种情况下,方法名称中不会有 a :。例如,- (void) reload;这将是一个不返回值且不带参数的方法。
  4. 如果您的方法需要参数,它们将混合到方法名称中,并且通常会声明类型(与您的示例不同)。例如- (NSString *) reverseString:(NSString *) stringToReverse;在本例中,您的方法名称将是reverseString:它带有一个参数,该参数将在方法定义中NSString*被调用。stringToReverse
  5. 通常,如果您看到 a:没有类型,则会出现这种情况,- (float) addThreeValues:::此方法返回一个浮点数并接受 3 个参数。这将是一个适当的定义,因为这三个值与它们提供的顺序无关,因为我们只是添加它们。
于 2012-04-27T22:57:13.493 回答