以点表示法取多个参数的方法

时间:2010-02-07 09:30:21

标签: objective-c

我在目标c上观看此视频。那个人展示了一个带有多个参数的方法,看起来像这个

- (void) setTo: (int) n over: (int) d
{ .... }

使用它,他表示:

[myFraction setTo: 100 over:200];

支架符号如何以点符号显示?安迪不明白那是什么 意味着,有人会知道吗?日Thnx

5 个答案:

答案 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

但是你不能用点表示法传递多个参数。