0

我知道的大多数语言都使用以下语法:

function name (var1,var2,var3) {
    //do stuff with variables
}

然而,Objective-C 使结构更加复杂

- (function type) functionName:(type)var1 var2:(type) var2  var3:(type) var3{
}

为什么根本不

- (function type) functionName:(type) var1 (type) var2 (type) var3{
}

是否有可能进行以下操作,这有什么意义?

- (function type) functionName:(type)var1 randomName:(type) var2  anotherName:(type) var3{
}
4

3 回答 3

8

省略冒号之前的部分是完全合法的 Objective-C。如果 API 设计者想要,他们可以这样写:

- (void)removeObserver:(NSObject *)observer :(NSString *)keyPath :(void *)context

代替

- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context

现在尝试阅读该代码

[self removeObserver:self :@"something" :@"somethingElse"];

[self removeObserver:self forKeyPath:@"something" context:@"somethingElse"];

什么更具可读性?

顺便说一句,有一些 OS X API 方法的方法名称和参数没有交错。一个例子是 CAMediaTimingFunction:

+ (id)functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y
于 2013-02-27T20:54:25.837 回答
3

Objective-C 方法被设计为自我记录,它们借鉴了 Smalltalk 的丰富传统。您可以查看有关此Stackoverflow 答案的详细说明

通过自我记录,这意味着方法声明本身为您提供了方法主要功能是什么以及接收到的参数的目的的信息。

所以,要回答你的最后一个问题,是的,你可以使用这样的方法声明,这确实是 Objective-C 的优点之一,你可以描述接收到的参数。

以此为例:

- (BOOL)saveFile:(NSString *path, NSString *fileName);

在 Objective C 上,您可以解释为自己记录这样的方法:

- (BOOL)saveFileInPath:(NSString *)path withName:(NSString *)name;
于 2013-02-27T20:49:51.523 回答
2

Objective-C 语法的目的是为了清晰。因此,当您阅读一行代码时,您就会确切地知道发生了什么。

例如:

[myData writeToFile:@"/tmp/log.txt" atomically:NO append:YES];

myData.writeToFile("/tmp/log.txt", false, true);

在我看来,第一行代码更清晰。只需阅读方法调用,您就可以准确地知道每个参数的作用。

于 2013-02-27T20:51:26.093 回答