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

时间:2014-06-05 02:50:17

标签: ios swift

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

say("Henry","Hi,Swift")  <---- error because missing argument label 'msg' in call

我需要使用

   say("Henry",msg:"Hi,Swift")

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

6 个答案:

答案 0 :(得分:68)

一个可能的原因是它实际上是一种方法。方法非常偷偷摸摸,它们看起来就像常规功能,但它们不会以同样的方式行事,让我们看看这个:

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)

现在这里是有趣的部分,在课堂内宣布一个功能,它不再是一个功能......它是一种方法

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

var someInstance = SomeClass()
someInstance.someClassFunctionWithParamOne(1, paramTwo: 4)

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

Apple Docs:

  

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

注意自动完成: enter image description here

答案 1 :(得分:11)

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

答案 2 :(得分:1)

这是编译器中的一个怪癖。函数(不是类的成员)和类方法在命名参数方面具有不同的默认行为。这与Objective-C中命名参数的行为一致(但对于没有使用Objective-C经验的swift新手来说没有任何意义。)

这里有关于函数的命名参数的语言参考说明(特别是没有给出参数外部名称的参数,参数没有默认值)

  

但是,这些参数名称仅用于体内   函数本身,并且在调用函数时 不能 。这些   各种参数名称称为本地参数名称,因为   它们只能在函数体内使用。

有关课程方法的信息,请参阅Logan的答案。

答案 3 :(得分:1)

Swift 3.0更新:

在swift 3.0中,每个输入都有一个参数名称的方法需要将该参数名称作为函数调用的一部分。所以如果你定义像这样的函数

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

你的函数调用必须是这样的

self.say(name: "Henry",msg: "Hi,Swift")

如果你想让英文像可读的功能标签,但又不想改变输入参数名称,可以在参数名称前添加标签,如下所示

func say(somethingBy name:String, whoIsActuallySaying msg:String) {
    print("\(name) say \(msg)")
}

然后像这样调用它

self.say(somethingBy: "Henry",whoIsActuallySaying: "Hi,Swift")

答案 4 :(得分:0)

简单:

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

不正确:

say("Henry")

正确:

say(name:"Henry")

PS:您必须始终!添加&#34; 名称功能参数&#34;在价值之前。

答案 5 :(得分:-1)

请在3+以上版本中找到用于理解的小代码。

func sumInt(a:Int,b:Int){
    print(a+b) // Displays 3 here
}

sumInt(a: 1, b: 2) // not like in other languages