为什么我们需要命名方法参数?

And*_*mig 9 objective-c

我们现在拥有的:

@interface BGTest
-(void)someMethodWithName:(NSString *)methodName tag:(NSUInteger)tag path:(NSURL *)path;
@end
Run Code Online (Sandbox Code Playgroud)

为什么不写:

@interface BGTest
-(void)someMethodWithName:(NSString *) tag:(NSUInteger) path:(NSURL *)
@end
Run Code Online (Sandbox Code Playgroud)

据说ObjC方法名称应该是自我记录的,并且它们是.如果方法可以用较少的代码更清晰,为什么要写更多?

我的意思是,为什么我们需要在接口部分命名方法参数,而不仅仅是在实现中?

Fre*_*ame 7

您不能声明没有参数名称的方法,因为在这种情况下,编译器无法判断类型后面的下一个标记是参数名称还是方法名称的一部分.让我在这个例子中演示它:

-(void)testMethodWithParam:(int)a secondParam:(int)b;
Run Code Online (Sandbox Code Playgroud)

这是一个正确的方法声明.现在让我们按照您的建议进行编辑:

-(void)testMethodWithParam:(int) secondParam:(int);
Run Code Online (Sandbox Code Playgroud)

这对我们来说非常明显我们的意思.我们可以说,这secondParam:显然是方法名称的一部分.但是Objective-C允许我们在这样的空格之后写一个列:

-(void)testMethodWithParam:(int) secondParam :(int);
Run Code Online (Sandbox Code Playgroud)

这种情况(从我的观点来看)不再那么清楚了.特别是如果我们删除一个空格:

-(void)testMethodWithParam:(int)secondParam :(int);
Run Code Online (Sandbox Code Playgroud)

现在它看起来像是secondParam第一个参数的名称,并且缺少方法名称的一部分.我想,为了使这些问题更容易解决,Objective-C让我们编写了一个完整的方法规范.我认为,他们可以稍微改变一下方法声明格式,以便允许这样的声明(我喜欢你的想法),但现在就是这样.

不过,你可以在使用不同的变量名@interface@implementation.所以这:

@interface TestClass : NSObject
-(void)testMethodWithParam:(int)a secondParam:(int)b;
@end

@implementation TestClass
-(void)testMethodWithParam:(int)firstParam secondParam:(int)secondParam
{...}
@end
Run Code Online (Sandbox Code Playgroud)

是合法的.

PS顺便说一句,在这种情况下,@ CodaFi使用下划线作为变量名称的想法可能很好:

@interface TestClass : NSObject
-(void)testMethodWithParam:(int)_ secondParam:(int)_;
@end
Run Code Online (Sandbox Code Playgroud)

有趣的是它编译,尽管事实上我对两个变量名都使用了一个下划线.