我目前正在学习自己的Objective-c和iOS编程,并且由于这个微妙的错误持续了一个小时,我发现自己陷入了非工作代码。 请考虑以下代码:
@property (strong, nonatomic) NSString *name;
- (NSString *):name { return @"Some name"; }
乍一看(对于任何新人),这看起来像是name
属性的重写getter。但是有一个非常微妙的:,不应该存在。这里没有来自编译器/解析器/运行时的警告/错误,所以我的问题是这实际上最终是什么?
一旦看到错误,我试图找到一种调用此方法的方法,但在我的几次尝试中没有成功。
答案 0 :(得分:13)
方法签名- (NSString *):name
分解为以下内容:
-
这是一个实例方法(与具有+
的类方法相比)。(NSString *)
返回一个字符串。:
如果您要说出此方法的名称,它将简称为“冒号”。 :
告诉编译器您的方法也接受一个参数。name
有一个名为name的参数。 当你没有指定一个类型时,编译器假定你的意思是id
,所以这个方法实际上充实为- (NSString *):(id)hello
对此方法的有效调用是:[self :@"hello"]
。
你可以做一些非常奇怪的事情,因为:
是方法的有效名称,编译器假设id
。如果您真的想,可以使用名为- :::
的方法。编译器会假设您的意思是- (id):(id):(id):(id)
,该方法返回类型为id
的对象,并采用类型为id
的三个参数。您可以这样称呼它:[self :@"hello" :anObject :myObject];
答案 1 :(得分:3)
一个方法声明就像你发布的方法很少(而且风格很差,imo)。 Objective-C应该是冗长的。方法分解如下:
-
或+
。 -
表示它是一个实例方法,+
表示它是一个类方法。(NSString *)
。:
。例如- (void) reload;
这将是一个不返回值且不带参数的方法。 - (NSString *) reverseString:(NSString *) stringToReverse;
在此示例中,您的方法名称为reverseString:
,它需要一个参数,NSString*
将在方法定义中称为stringToReverse
。:
没有类型,则会出现类似- (float) addThreeValues:::
的情况。此方法返回一个浮点并获取3个参数。这将是一个合适的定义,因为这三个值并不重要,因为我们只是添加它们。