【问题标题】:Empty method name, what does this actually do?空方法名,这实际上是做什么的?
【发布时间】:2012-04-27 22:38:26
【问题描述】:

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

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

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

一看到错误,我就想办法调用这个方法,但几次尝试都没有成功。

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    方法签名- (NSString *):name 分解为:

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

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

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

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

    【讨论】:

    • +1,仅用于If you were to speak the name of this method, it would simple be called ... colon
    • 其实方法名是“空字符串”。在说出方法名称时,您通常不会说冒号,即使它们在那里......令人困惑,我知道......但它有点像英语中的“,”。暂停或连接符,但没有说出来。
    • @bbum 实际上,Apple 表示,说方法的官方方式是说出所有的冒号。立即查看文档中的行...
    • 感谢您的准确回答。这里的解析器警告会很好。
    • 我很想看看那些文档,Jack,因为我要和作者一起挑骨头——冒号。 :) 不过,最重要的是,名为“:”、“::”或“:::”的方法肯定会激怒任何有经验的 ObjC 程序员。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 2011-03-11
      • 2010-11-26
      • 2015-06-23
      • 2017-12-26
      相关资源
      最近更新 更多