我在目标c上观看此视频。那个人展示了一个带有多个参数的方法,看起来像这个
- (void) setTo: (int) n over: (int) d
{ .... }
使用它,他表示:
[myFraction setTo: 100 over:200];
支架符号如何以点符号显示?安迪不明白那是什么 意味着,有人会知道吗?日Thnx
答案 0 :(得分:2)
点符号只是属性访问的简写符号。编译器将其转换为适当的setter / getter方法调用。它只是语法糖。
因此,使用点表示法访问此属性:
myFraction.numerator=100;
编译器将其替换为以下等效代码:
[myFraction setNumerator:100]
现在应该清楚为什么你不能使用点表示法向对象发送正常的消息。我甚至想不出一个怎么样的样子。
关于点与括号表示法有很多讨论正在进行中。反对点符号的一个论点是它特别为初学者产生的混乱。其他语言当然也使用属性访问器的方法,但是它们比Objective-C更加一致地隐藏了这个事实。
答案 1 :(得分:1)
你无法使用点表示法传递多个参数。点符号可用的setter必须具有原型
-(void)setXxxx:(type)value;
但是,您可以创建一个辅助结构,将所有参数分组为一个:
struct Fraction { int n, d; };
struct Fraction MakeFraction(int n, int d) {
struct Fraction r;
r.n = n;
r.d = d;
return r;
}
...
-(void)setValue:(struct Fraction)f { ... }
...
myFraction.value = MakeFraction(100, 200);
( a “over” b 表示 a / b 。)
答案 2 :(得分:0)
从它的外观来看,这个方法是设置对象的两个实例变量/属性,分子(n)和分母(d)。除非将其分为两个调用,否则不能使用点表示法执行此操作:
myFraction.numerator=100;
myFraction.denominator=200;
请注意,点表示法仅用于访问实例变量/属性,而不是消息发送的替代方法。
答案 3 :(得分:0)
在Objective-C中,我们可以在 middle 中使用参数命名方法。因此,当他写[myFraction setTo:100 over:200];
时,over
可能意味着......好吧,无论他想要什么。这是他选择的方法名称的一部分。在这种情况下,他可能试图让这个方法听起来像英语。 (“将此分数设置为100以上200.”我们通常在正常语音中将分数读作“分子而不是分母”。)
我们经常编写一些称为“访问器”的方法:这些方法的形式为- (int)variable
(称为“getters”)和- (void)setVariable:(int)newValue
(称为“setters”)。我的示例将假定分别返回或更改名为variable
的实例变量。以下是方法实现的样子:
- (int)variable
{
return variable;
}
- (void)setVariable:(int)newValue
{
variable = newValue;
}
对于几乎每个类的实例变量都有这样的访问器是很常见的。在某些时候,有人厌倦了写[myInstance setVariable:20];
等等,并决定他们看起来像其他许多语言,myInstance.variable = 20;
。
因此,Objective-C 2.0增加了点符号,可以让你写...
myInstance.variable
,在大多数情况下完全等同于[myInstance variable]
(并且不直接访问实例变量variable
!),并且......
特殊情况myInstance.variable = 20;
,完全等同于[myInstance setVariable:20];
。请注意,这不会直接访问variable
,而是会向myInstance
发送消息。因此,如果我们在setVariable
中编写了一些其他代码,如果我们使用点表示法,它仍然会被访问。
点符号旨在用于访问器。理论上,您也可以将它用于任何返回值且不带参数的方法(例如myArray.count
)。将其用于其他任何事情(myInstance.doSomeAction
)非常糟糕的风格。不要这样做。因此,我确信您现在可以猜到,[myFraction setTo:100 over:200]
没有点符号等价,因为它需要2个参数,并且不是访问者。
答案 4 :(得分:0)
[myFraction numerator]
可以写成
myFraction.numerator
但您也可以指定
等值instance.property = value
但是你不能用点表示法传递多个参数。