http://stackoverflow.com/questions/24050844/swift-missing-argument-label-xxx-in-call

func say(name:String, msg:String) {
println("\(name) say \(msg)")
} say("Henry","Hi,Swift") <---- error because missing argument label 'msg' in call

I need to use

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

Why ? If I put more than two var in func so that I need to write var name instead of first var when I call this func
It's really trouble, and I don't see any explain in iBook Swift tutorial.

asked Jun 5 '14 at 2:50
henry4343
1,5511817
 
2  
your function name is "say" yet you are calling sayHello?? –  Sam B Jun 5 '14 at 2:56
1  
    
I have been seen this question but it didn't solve my problem –  henry4343 Jun 5 '14 at 3:03
    
Is this a method? (A function w/in the scope of a class?) –  Logan Jun 5 '14 at 3:17

3 Answers

One possible reason is that it is actually a method. Methods are very sneaky, they look just like regular functions, but they don't act the same way, let's look at this:

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 externalInternalShared(paramOne: 1, paramTwo: 4)

Now here's the fun part, declare a function inside of a class and it's no longer a function ... it's a method

class SomeClass {
func someClassFunctionWithParamOne(paramOne: Int, paramTwo: Int) {
println("someClassFunction: \(paramOne) : \(paramTwo)")
}
} var someInstance = SomeClass()
someInstance.someClassFunctionWithParamOne(1, paramTwo: 4)

This is part of the design of behavior for methods

Apple Docs:

Specifically, Swift gives the first parameter name in a method a local parameter name by default, and gives the second and subsequent parameter names both local and external parameter names by default. This convention matches the typical naming and calling convention you will be familiar with from writing Objective-C methods, and makes for expressive method calls without the need to qualify your parameter names.

Notice the autocomplete: 

answered Jun 5 '14 at 4:37
Logan
15.7k62058
 
    
Funny how without providing the name for the second parameter in Playground seems to work beautifully! – user1107173 Oct 10 '14 at 4:56
1  
@user1107173 - That's because it's out of the context of a class. If you put it inside a class, it would provide the name for the second parameter. Playground doesn't have anything to do with it :) –  Logan Oct 10 '14 at 13:03

This is simply an influence of the Objective-C language. When calling a method, the first parameter of a method does not need to be explicitly labelled (as in Objective-C it is effectively 'labelled' by the name of the method). However all following parameters DO need a name to identify them. They may also take an (optional) local name for use inside the method itself (see Jiaaro's link in the comments above).

answered Jun 5 '14 at 3:22
Ephemera
3,18031752
 
    
I feel like instead of saying "does not need to be explicitly labeled" we could say "cannot be labeled" because adding a label there will result in a compilation error. –  ShaChris23 Jun 20 '14 at 6:15

This is a quirk in the compiler. Functions (which are not members of a class) and class methods have different default behavior with regards to named parameters. This is consistent with the behavior of named parameters in objective-C (but makes no sense for someone new to swift with no experience with objective-C).

Here's what the language reference has to say about named parameters for functions (specifically parameters where an external name for the parameter is not given, and the parameter does not have a default value)

However, these parameter names are only used within the body of the function itself, and cannotbe used when calling the function. These kinds of parameter names are known as local parameter names, because they are only available for use within the function’s body.

For information about class methods, see Logan's answer.

answered Jun 5 '14 at 3:39
user3386109
11.9k21227
 
    
It's actually not that simple. If you read further into the documentation, there are times when the internal name is automatically turned into an external name, from what I remember it's primarily within class definitions the 2nd and following tags are required by default. –  David Berry Jun 5 '14 at 6:10
2  
@David Agreed, my answer covers the case where the func is actually a function. Logan's answer covers the case where the func is actually a method. Personally, I don't like this design choice on Apple's part. The function/method calling syntax should be consistent, regardless of context. Programmers can use the #syntax to force the use of parameter names as a matter of style. –  user3386109 Jun 5 '14 at 6:28

Swift : missing argument label 'xxx' in call的更多相关文章

  1. Swift 1.0: missing argument label 'xxx' in call

    注意,这个问题是在swift1.0时发生的,swift2.0中,好像统一了function 和 method 的定义,具体待正式版发布后研究一下! 今天在使用swift时发现,写的func总是要求写出 ...

  2. linux报错 find: missing argument to `-exec'

    在linux下使用find命令时,报错:find: missing argument to `-exec' 具体执行命令为: find /u03 -name server.xml -exec grep ...

  3. Loadrunner 运行场景时:missing newline in XXX.dat 错误解决

    脚本参数化类型为file,在controller里运行场景的时候,报了个missing newline的错误,查了一下,将参数化的dat文件中的最后一行补上一个空行就解决啦!! 如果遇到此错误,需检查 ...

  4. swift学习之Label

              //UILabel的使用方法        let label:UILabel = UILabel(frame: CGRect(x: 0, y: 100, width: view. ...

  5. Missing associated label more...

    1.加上placeholder,可以为空 2.放在label标签中

  6. swift学习之label,button,imageView,字符串,数组,字典

    import UIKit class ViewController: UIViewController,UITextFieldDelegate { var textField: UITextField ...

  7. find: missing argument to `-exec'

    man find 发现 花括号要加 '' find ${LOG_BASE_DIR}$dir/ -type f -mtime +${KEEP_DAYS} -name ${LOG_REG} -exec r ...

  8. swift 动态获取label宽度或高度

    func getLabHeigh(labelStr:String,font:UIFont,width:CGFloat) -> CGFloat { let statusLabelText: NSS ...

  9. Swift函数_默认参数

    swift中提供了默认参数功能,在声明函数时给参数指定默认值. 例: func inputStudentInfo(name:String,age:Int="26") { print ...

随机推荐

  1. ES5新增数组方法(2):map

    通过指定函数处理数组的每个元素,并返回处理后的数组. 1.计算数组中每个元素的平方 let arr = [1, 2, 3, 4, 5, 6]; let newArr = arr.map(item =& ...

  2. ES6 语法糖

    重新认识ES6中的语法糖:https://segmentfault.com/a/1190000010159725

  3. final static 修饰(转载)

    static修饰符        static修饰符能够与属性.方法和内部类一起使用,表示静态的.类中的静态变量和静态方法能够与类名一起使用,不需要创建一个类的对象来访问该类的静态成员,所以,stat ...

  4. Ubuntu 进阶命令——长期不定时更新

    有时候远程连接服务器忽然中断或者不小心关掉了终端界面,正在运行的命令或者程序就会被强制停止.这时候,我们可以借助一些命令来避免这种情况的发生. nohup 不挂断地运行命令 & 在后台运行命令 ...

  5. Python 3 学习笔记之——键盘输入和读写文件

    1. 键盘输入 Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘.input 可以接收一个 Python 表达式作为输入,并将运算结果返回. str = inp ...

  6. 数据结构6——DFS

    一.相关定义 深度优先遍历,也有称为深度优先搜索,简称DFS.其实,就像是一棵树的前序遍历. 初始条件:图G所有顶点均未被访问过,任选一点v. 思想:是从一个顶点V1开始,沿着一条路一直走到底,如果发 ...

  7. Introduction to TCP/IP

    目录 First Week DHCP 子网掩码 ip路由表 Second Week ipv4 ipv6 TCP和UDP Third Week NAT RPC FTP E-mail Fouth Week ...

  8. jquery UI 跟随学习笔记——拖拽(Draggable)

    引言 这周暂时没有任务下达,所以老大给我的任务就是熟悉jquery相关插件,我就先选择了jquery UI插件,以及jquery库学习. 我用了两天的时候熟悉Interactions模块中的Dragg ...

  9. PAT 1086 就不告诉你

    https://pintia.cn/problem-sets/994805260223102976/problems/1038429065476579328 做作业的时候,邻座的小盆友问你:“五乘以七 ...

  10. qemu的drive参数解释

    drive参数很简单,可以理解成是定义了一个实际的硬盘(或者是cd)与drive对应的是device-drive option[,option[,option[,...]]] Define a new ...