objective-c syntax - why use methodNameVariable:(type) variable anotherVariable:(type) anotherVariable
我知道的大多数语言都使用以下语法:
1 2 3 | function name (var1,var2,var3) { //do stuff with variables } |
然而,目标C使结构更加复杂。
1 2 | - (function type) functionName:(type)var1 var2:(type) var2 var3:(type) var3{ } |
为什么不简单
1 2 | - (function type) functionName:(type) var1 (type) var2 (type) var3{ } |
是否有可能进行跟踪,这有什么意义?
1 2 | - (function type) functionName:(type)var1 randomName:(type) var2 anotherName:(type) var3{ } |
这是完全合法的目标-C省略结肠前的部分。如果API设计者想要,他们可以写:
1 | - (void)removeObserver:(NSObject *)observer :(NSString *)keyPath :(void *)context |
而不是
1 | - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context |
现在试试看代码
1 | [self removeObserver:self :@"something" :@"somethingElse"]; |
而不是
1 | [self removeObserver:self forKeyPath:@"something" context:@"somethingElse"]; |
什么更可读?
顺便说一下,有一些OS X API方法的方法名和参数没有交错。一个例子是cameratimingfunction:
1 | + (id)functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y |
客观性C方法是一种自我记录的方法,它借鉴了Smalltalk的丰富传统。您可以看到这个stackoverflow答案的详细说明。
通过自我记录,这意味着方法声明本身向您提供了方法的主要功能和接收参数的目的的信息。
所以,要回答最后一个问题,可以使用这样的方法声明,这确实是Objective-C的优点之一,您可以描述收到的参数。
例如:
1 | - (BOOL)saveFile:(NSString *path, NSString *fileName); |
在目标C中,您可以这样解释自己记录方法:
1 | - (BOOL)saveFileInPath:(NSString *)path withName:(NSString *)name; |
Objective-C语法是为了清晰起见。所以当你读到一行代码时,你就知道到底发生了什么。
例如:
1 | [myData writeToFile:@"/tmp/log.txt" atomically:NO append:YES]; |
而不是
1 | myData.writeToFile("/tmp/log.txt", false, true); |
在我看来,代码的第一行更清晰。您只需通过读取方法调用就可以确切地知道每个参数的作用。