2011-06-08 64 views
4

我来自C++/C#/ Java阵营,并很困惑,当我看到下面的Objective-C的语法...Objective-C的语法问题

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

从我明白了什么叫云(返回类型)functionName :(参数类型)参数;像下面这样

- (void)applicationWillResignActive:(UIApplication *)application { } 

什么与参数(UIApplication *)应用didFinishLaunchingWithOptions?

回答

3

在Objective-C的参数是方法签名的一部分。您描述的方法的选择器将是application:didFinishLaunchingWithOptions:。这个来自Smalltalk,虽然它可能使方法声明难读,它使代码实际上是容易阅读:

id anApplication; 
id someOptions; 

[delegate application:anApplication didFinishLaunchingWithOptions:someOptions]; 

正如你所看到的,所产生的调用代码看起来好像你在读一个短语。

至于UIApplication参数,这是您可以在整个可可中看到的设计选择。委托中的所有方法都将接收它们委派的对象作为其第一个参数。这使得您可以重用委托,并使其逻辑取决于它们所委派的对象。

在这种情况下,您可以针对不同的UIApplication实例使用相同的UIApplicationDelegate,并根据一些UIApplication参数将其代码作为条件。

+0

design choice = visitor? – 2011-06-08 20:59:09

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

打破了那种奇怪。

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

会使它更容易阅读我猜。这里有两个参数,应用程序和launchOptions。

+0

如果应用程序:(UIApplication *)应用程序是一个参数,为什么它在方法名称(didFinishWithLaunchOptions)之前? – 2011-06-08 20:49:39

1

didFinishLaucnhingWithOptions:part是另一个参数的标识符,launchOptions - 它是一个NSDictionary * - ,所以不是在逗号间插入一个逗号(java),而是一个空格,然后是描述符,然后是冒号然后是paramater。但是,实际方法签名包括这些标识符或描述符。

编辑:请参阅@pgb回答以获得更好的描述。

它使代码更容易阅读,并且使程序员难以拥有蹩脚的变量名称,如a,b,c,foo,bar等等,您不知道自己是什么或做什么。

实施例:

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

这很奇怪,同一个参数有两个标识符? paramater2descriptor和parameter2 ...有什么区别? – 2011-06-08 20:51:52

+0

描述符可能不是最好的术语。参数*是* paramater2,当您想要使用它时(foo = paramater2),它在方法内部使用。谷歌中缀表示法,它基本上是一种方法,可以知道方法调用中的参数是什么(为什么目标c是'详细的') – 2011-06-08 20:56:36

3

这是什么帮助我得到它。所有参数都被命名。奇怪是因为你的第一个参数名称实际上是函数名称的一部分,或者,你可以把它想象为:实际上没有第一个参数名称。很多时候,你会看到或写看起来像这样的功能:

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

注意,在函数名末尾的废话描述,描述帕拉姆。 ;-)

这很早就扭曲了我,但你很快就习惯了,而且在使用其他语言的时候你会错过它。:-)

希望有帮助,玩得开心!

+0

+1希望我可以选择两个答案,这与我选择的答案相结合帮助我理解它。 – 2011-06-08 21:12:49

+0

+1,但请使用小写字符开始方法名称:-) – DarkDust 2011-06-09 07:05:54