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

kon*_*v12 2 xcode ios swift

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

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

为什么我们有didFinishLaunchingWithOptions作为一个论点?我知道这application将是 typeUIApplication并且 launchOptions 将是 type UIApplicationLaunchWithOptionsKey: any,但是为什么我们只在那里调用了这个“存根”didFinishLaunchingWithOptions如果您知道我的意思?

另外,第一个参数之前的下划线是什么意思?我不得不多次把它放在那里,这样我的功能才能工作。

Ped*_*lho 6

在 Swift 中,所有参数都是命名的。但是,有时这会变得很麻烦或导致函数内部出现奇怪的参数名称。例如,如果你有一个函数看起来像

func makeNewThing(fromDifferentThing: SomeThing)
Run Code Online (Sandbox Code Playgroud)

在函数fromDifferentThing内部引用函数的参数会感觉很奇怪。

为了解决这个问题,Swift 允许您为相同的函数参数提供两个名称。一个参数名称将在函数外部使用,另一个名称将在函数内部使用。外部参数名称称为参数标签,内部名称通常称为参数名称

因此,在我的示例中,您可以将函数定义为

func makeNewThing(fromDifferentThing thing: SomeThing) 
Run Code Online (Sandbox Code Playgroud)

然后thing在函数内部引用参数,但将函数调用为

makeNewThing(fromDifferentThing: thing)
Run Code Online (Sandbox Code Playgroud)

下划线也与此有关。有些函数并不真正需要解释它们的参数是什么,所以 Swift 允许你说你的函数的第一个参数没有参数 label。您可以简单地调用这样的函数:

function(argument1, label2: argument2, label3: argument3...)
Run Code Online (Sandbox Code Playgroud)

并将其定义为:

func function(_ argument1: Type1, label2 argument2: Type2, /* ...and so on */)
Run Code Online (Sandbox Code Playgroud)