Objective-C语法问题

4

我来自c++/c#/java阵营,看到下面的objective-c语法就感到困惑...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
    (NSDictionary *)launchOptions { }

据我理解,它的格式应该是 (返回类型)函数名:(参数类型)参数;,具体如下:
- (void)applicationWillResignActive:(UIApplication *)application { }

参数(UIApplication *)application didFinishLaunchingWithOptions是什么意思?

4个回答

3
在 Objective-C 中,参数是方法签名的一部分。您描述的方法的选择器将是 application:didFinishLaunchingWithOptions:。这来自于 Smalltalk,虽然它可能会使方法声明更难以阅读,但它确实使代码易于阅读:
id anApplication;
id someOptions;

[delegate application:anApplication didFinishLaunchingWithOptions:someOptions];

如您所见,调用结果的代码看起来就像在读一句话。
至于UIApplication参数,这是Cocoa中你会看到的一个设计选择。在委托中的所有方法都将对象作为其第一个参数,它们是委托的对象。这使您能够重用委托,并使其逻辑取决于它们是委托的对象。
在这种情况下,您可以为不同的UIApplication实例使用相同的UIApplicationDelegate,并根据一些UIApplication参数使其代码有条件地运行。

3

这是帮助我理解的方法。所有参数都有名称。奇怪的地方在于你的第一个参数名称实际上是函数名称的一部分,或者你可以认为它根本没有第一个参数名称。很多时候,你会看到或编写类似以下的函数:

-(returntype) SomeFunctionWithSuperParameterComingUpNext:(paramtype)param1 SuperParam2:(paramtype2)param2;

注意,函数名称末尾的无意义描述是关于参数的。;-)

这个在我刚开始时真的让我很困惑,但你会很快习惯它,当使用其他语言时你实际上会错过它。:-)

希望这有所帮助,玩得开心!


+1 希望我能选择两个答案,这个与我选择的答案结合起来帮助我理解了它。 - Tom Fobear
+1,但请以小写字符开头命名方法 :-) - DarkDust

1

didFinishLaunchingWithOptions: 部分是另一个参数 launchOptions 的标识符,它是一个 NSDictionary* 类型的参数。因此,与参数之间用逗号隔开(Java)不同,它们之间用空格、描述符和冒号隔开。然而,实际的方法签名包括这些标识符或描述符。

编辑:请参见 @pgb 的答案,以获得更好的描述。

这使得代码更易于阅读,并使程序员很难使用糟糕的变量名称,如 a、b、c、foo、bar 等,你不知道它们是什么或者做什么。

例如:

-(returntype) myFunction:(paramater1type)paramater1 paramater2descriptor:(paramater2type)paramater2 paramater3descriptor:(paramater3type)paramter3 {}

这很奇怪,同一个参数有两个标识符?paramater2descriptor和parameter2...它们有什么区别? - Tom Fobear
描述符可能不是最好的术语...参数参数2,当您想要使用它时(foo = paramater2),它是在方法内部使用的。谷歌中缀表示法,这基本上是一种了解方法调用中哪些参数是什么的方法(这就是为什么Objective C很“冗长”的原因)。 - Jesse Naugher

0
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
    (NSDictionary *)launchOptions { }

排版有点奇怪。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { }

这样做可能会使阅读变得更容易。这里有两个参数,应用程序和启动选项。


如果application:(UIApplication *)application是一个参数,为什么它要在方法名(didFinishWithLaunchOptions)之前? - Tom Fobear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接