2017-04-03 42 views
1

这是一个非常初级的问题,但我一直想知道的是,例如在这种方法:为什么Swift中的方法可以有没有类型的参数?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

为什么我们有didFinishLaunchingWithOptions作为参数?我知道application的类型为UIApplication,launchOptions的类型为UIApplicationLaunchWithOptionsKey: any,但为什么我们只有这个存根叫做didFinishLaunchingWithOptions,如果你知道我的意思吗?

另外,下划线在第一个参数前是什么意思?我不得不在那里多次让我的功能起作用。

+2

那是[参数标签(https://developer.apple.com/library/content/documentation/ Swift/Conceptual/Swift_Programming_Language/Functions.html#// apple_ref/doc/uid/TP40014097-CH10-ID166) – Hamish

+0

Got you!感谢您的链接 – konyv12

回答

4

在Swift中,所有参数都被命名。但是,有时这可能会变得繁琐或导致函数内部的怪异参数名称。举例来说,如果你有一个看起来像

func makeNewThing(fromDifferentThing: SomeThing) 

会觉得不可思议指函数的参数作为fromDifferentThing在函数内部的功能。

要解决这个问题,Swift可以让你给出相同的函数参数两个的名字。一个参数名称将被用于以外的的功能,另一个名字将被用于里面的的功能。外部参数名称被称为参数标签,内部名称通常被称为参数名称

所以在我的例子中,你可以定义你的功能

func makeNewThing(fromDifferentThing thing: SomeThing) 

,然后参考参数为thing里面的功能,但调用该函数作为

makeNewThing(fromDifferentThing: thing) 

的下划线也与此有关。有些函数并不需要解释他们的参数是什么,所以Swift允许你说你函数的第一个参数是没有参数标签。你会叫这样的功能只是为:

function(argument1, label2: argument2, label3: argument3...) 

,并把它定义为:

func function(_ argument1: Type1, label2 argument2: Type2, /* ...and so on */) 
+1

并不是所有的参数都被命名 - 'func foo(_:String){}'没用,但是合法。 – Hamish

+0

很好的答案,清理了很多东西,谢谢。 – konyv12

2

我明白application将是UIApplication型和launchOptions将类型[IApplicationLaunchWithOptionsKey: any]

的是什么下划线的第一个参数之前是什么意思?

这两个问题是相关的。这两个名字中的第一个名为变元标签。如果存在,这是您在调用方法时在冒号前写的内容。如果缺席,则参数名称将成为其标签。如果您不需要参数的参数标签,请改为写下划线(_)。

下面是这三个选项的摘要:

  • 有一个参数标签和名称 - func foo(bar baz:String),叫foo(bar:"Hello")
  • 只有一个参数名称 - func foo(baz:String),叫foo(baz:"Hello")
  • 使用下划线_作为参数标签 - func(_ baz:String),致电foo("Hello")
+0

在这种情况下,我还要补充说,参数标签是用于“历史”原因。在Objective-C中,该函数被称为' - (BOOL)应用程序:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions'。所以在将它转换为Swift时,他们使用参数标签来使它看起来与Objective-C挂件相似。 – JoRa

+0

所以,如果你不添加下划线,当你调用方法时,你不需要指定任何字符串,只需要传入的值(类似于JavaScript)? – konyv12

+0

@ konyv12反过来:如果你添加下划线,那么你可以传递没有标签的参数。查看编辑。 – dasblinkenlight

相关问题