为什么Swift中的方法可以包含没有类型的参数?

时间:2017-04-03 16:44:54

标签: ios swift xcode

这是一个非常初学的问题,但我总是想知道,例如在这个方法中:

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

为什么我们将didFinishLaunchingWithOptions作为参数?我了解application类型为UIApplication,而launchOptions类型为UIApplicationLaunchWithOptionsKey: any,但为什么我们只有这个'stub',其名称为didFinishLaunchingWithOptions,如果你知道的话我的意思是什么?

此外,在第一个参数之前,下划线的含义是什么?我不得不把它放在那里,所以我的功能会起作用。

2 个答案:

答案 0 :(得分: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 :(得分:2)

  

我了解application类型为UIApplicationlaunchOptions类型为[IApplicationLaunchWithOptionsKey: any]

     

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

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

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

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