ios 调用中缺少参数标签“xxx”

6g8kf2rb  于 2023-03-31  发布在  iOS
关注(0)|答案(7)|浏览(181)
func say(name:String, msg:String) {
    println("\(name) say \(msg)")
}

say("Henry","Hi,Swift") // error: missing argument label 'msg' in call

我需要使用

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

如果我在函数的参数列表中放置了两个以上的变量,那么在调用这个函数时,我需要写变量名,而不仅仅是变量名。
这真的很麻烦,我没有看到任何解释iBook Swift教程.

nukf8bse

nukf8bse1#

一个可能的原因是它实际上是一个方法。方法非常狡猾,它们看起来就像常规函数,但它们的行为方式不同,让我们看看这个:

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方法时熟悉的典型命名和调用约定相匹配,并且无需限定参数名即可实现富有表现力的方法调用。
注意自动完成:

ogq8wdun

ogq8wdun2#

这只是Objective-C语言的影响。当调用一个方法时,方法的第一个参数不需要显式标记(在Objective-C中,它实际上是由方法的名称“标记”的)。然而,所有后面的参数都需要一个名称来标识它们。它们也可以采用(可选)本地名称,以便在方法本身内部使用(参见上面注解中的Jiaro链接)。

pokxtpni

pokxtpni3#

简单:

错误的调用函数语法(在c/c++/java/c#中不相同)
不正确:

say("Henry")

正确:

say(name:"Henry")

PS:必须始终!value前加上name函数参数

7vhp5slm

7vhp5slm4#

Swift 3.0更新:

在Swift3.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")
laximzn5

laximzn55#

这是编译器中的一个怪癖。函数(不是类的成员)和类方法在命名参数方面有不同的默认行为。这与Objective-C中命名参数的行为一致(但对于没有Objective-C经验的Swift新手来说没有意义)。
下面是语言参考关于 * 函数 * 的命名参数的说明(特别是没有给出参数的外部名称并且参数没有默认值的参数)
然而,这些参数名只在函数本身的主体中使用,并且在调用函数时不能使用***。这些类型的参数名被称为局部参数名,因为它们只在函数的主体中使用。
有关类方法的信息,请参见Logan的回答。

erhoui1w

erhoui1w6#

如果您希望保留调用代码,现在可以使用underscores来避免标签:

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

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

...虽然标签在很多情况下对于可读性是有用的(比如这个--否则很难分辨参数的含义)。

cidc1ykv

cidc1ykv7#

请在swift 3+中找到小代码以供理解。

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

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

相关问题