Swift:在调用中缺少参数标签'xxx'

hen*_*343 72 ios swift

func say(name:String, msg:String) {
    println("\(name) say \(msg)")
}

say("Henry","Hi,Swift")  <---- error because missing argument label 'msg' in call
Run Code Online (Sandbox Code Playgroud)

我需要用

   say("Henry",msg:"Hi,Swift")
Run Code Online (Sandbox Code Playgroud)

为什么?如果我在func中放入两个以上的var,这样当我调用这个函数时我需要编写var name而不是first var
它真的很麻烦,我在iBook Swift教程中没有看到任何解释.

Log*_*gan 70

一个可能的原因是它实际上是一种方法.方法非常偷偷摸摸,它们看起来就像常规函数一样,但它们的行为方式不同,让我们来看看:

func funFunction(someArg: Int, someOtherArg: Int) {
    println("funFunction: \(someArg) : \(someOtherArg)")
}

// No external parameter
funFunction(1, 4)

func externalParamFunction(externalOne internalOne: Int, externalTwo internalTwo: Int) {
    println("externalParamFunction: \(internalOne) : \(internalTwo)")
}

// Requires external parameters
externalParamFunction(externalOne: 1, externalTwo: 4)

func externalInternalShared(#paramOne: Int, #paramTwo: Int) {
    println("externalInternalShared: \(paramOne) : \(paramTwo)")
}

// The '#' basically says, you want your internal and external names to be the same

// Note that there's been an update in Swift 2 and the above function would have to be written as:

func externalInternalShared(paramOne paramOne: Int, #paramTwo: Int) {
    print("externalInternalShared: \(paramOne) : \(paramTwo)")
}

externalInternalShared(paramOne: 1, paramTwo: 4)
Run Code Online (Sandbox Code Playgroud)

现在这里是有趣的部分,在类中声明一个函数,它不再是一个函数......它是一个方法

class SomeClass {
    func someClassFunctionWithParamOne(paramOne: Int, paramTwo: Int) {
        println("someClassFunction: \(paramOne) : \(paramTwo)")
    }
}

var someInstance = SomeClass()
someInstance.someClassFunctionWithParamOne(1, paramTwo: 4)
Run Code Online (Sandbox Code Playgroud)

这是方法行为设计的一部分

Apple Docs:

具体来说,默认情况下,Swift在方法中为第一个参数名称提供本地参数名称,默认情况下为第二个和后续参数名称提供本地和外部参数名称.此约定与您在编写Objective-C方法时熟悉的典型命名和调用约定相匹配,并且无需限定参数名称即可进行表达式方法调用.

注意自动完成: 在此输入图像描述


Eph*_*era 11

这只是Objective-C语言的影响.调用方法时,不需要显式标记方法的第一个参数(如在Objective-C中,它通过方法的名称有效地"标记").但是,以下所有参数都需要一个名称来标识它们.他们也可以在方法本身中使用(可选的)本地名称(参见上面评论中的Jiaaro链接).

  • 我觉得不是说"不需要明确标记",而是说"无法标记",因为在那里添加标签会导致编译错误. (2认同)

For*_*ran 8

简单的:

错误的调用函数语法(在 c/c++/java/c# 中不一样)

错误:

say("Henry")
Run Code Online (Sandbox Code Playgroud)

正确的:

say(name:"Henry")
Run Code Online (Sandbox Code Playgroud)

PS:你必须永远!在值之前添加“名称函数参数”。