我刚开始学习Objective-C,我不确定何时使用点符号与方括号。我知道有一个类似的问题被问到here,但我仍然没有真正理解其中的差异。我读过[myObject doSomething]
和myObject.doSomething
是等价的。我不确定的是,当我使用@property
生成方法时,它会自动生成一个我只能用方括号使用的setter方法。
// MyClass.h
@interface MyClass : NSObject
@property int number;
// main.m
MyClass *object = [[MyClass alloc] init];
[object setNumber:3];
object.setNumber = 4; // Property 'setNumber' not found
为什么我在编写object.setNumber = 4
时收到错误消息,为什么我只能使用方括号?
答案 0 :(得分:0)
您收到该错误,因为该属性名为number
而不是setNumber。在OOP语言中,通常使用“setter”和“getter”来创建访问对象数据的方法。 Objective-C 2.0中的属性合成了这个过程并自动生成了setter和getter。如果你进入MyClass.m并输入- setN
,你会看到Xcode建议的setNumber。这是因为您可以自己实现自己的setter和getter来自定义它们的行为,或者保留简单设置值或获取值的默认行为。
此外,属性会自动生成变量声明_variableName
例如,您的属性的默认行为是:
- (void) setNumber:(int)number {
_number = number
}
- (int) getNumber {
return _number;
}
确定是否应该使用其中一个真正归结为一致性。为确保团队的一致性,应制定样式指南。以NY Times为例。它们将点符号严格限制为非属性方法的属性和括号(即setter和getter)。
答案 1 :(得分:-1)
你的方法和属性令人困惑。
创建属性时,是的,它会创建一个名为setVARIABLE的setter方法。
调用方法的唯一方法是使用括号表示法。 IE [object setNumber:3];
(除非你有0或1个参数,谢谢你)
您要做的是使用属性名称,而不是setter(或getter)方法。
[object number];
这将返回数字的值。通过括号表示法访问属性时无法读取属性,它只是只读(只能访问get函数)。
object.number = 3;
这就是你用点符号设置属性编号的方法。
当您编写object.setNumber = 3;
时,您将setNumber视为属性,但它不是,它是一种方法。
回顾一下
[object setNumber:3];
(除非你有0或1个参数)[object number]; //returns the value of number
object.number = 3;