我试图在viewDidLoad中定义一个简单的函数,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// my method below
func add(number1:Int, number2:Int)
{
println("sum \(number1 + number2)")
}
add(5, 7) // able to invoke simply by passing values
}
这里我只能通过传递两个整数值来调用add函数,但是当我尝试在viewDidLoad之外定义add方法时这样:
// my method defined outside viewDidLoad
func add(number1:Int, number2:Int)
{
println("sum \(number1 + number2)")
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
add(5, number2: 7) // for second passed parameter I had to specify name of variable, since compiler was complaining
}
我无法通过传递两个值来调用它,我必须指定第二个变量的名称,因为编译器在抱怨。
有什么理由吗?
答案 0 :(得分:1)
正如David指出的那样,用作方法的函数(与对象相关的函数,即)处理与" plain"不同的参数。函数启用ObjC样式的消息传递:
具体来说,Swift在方法中给出了第一个参数名称 默认情况下参数名称,并给出第二个和后续的 默认情况下,参数名称为本地和外部参数名称。 此约定与您的典型命名和调用约定相匹配 熟悉编写Objective-C方法,并为之做好准备 表达方法调用,无需限定参数 名。
换句话说,Swift会将您的函数视为如果将其编写为如果将其定义为方法:
func add(number1:Int, #number2:Int)
{
println("sum \(number1 + number2)")
}
添加"#"对于第一个示例中的第二个参数,调用在两种情况下都是相同的(函数和方法调用)。 "#"本身是一个与本地参数名称匹配的参数名称的简写,所以这也适用:
func add(number1:Int, number2 number2:Int)
{
println("sum \(number1 + number2)")
}
这使得修复界面变得容易以更多句子风格的方式调用(同时切换到swift-guide样式括号放置):
func add(number1:Int, to number2:Int){
println("sum \(number1 + number2)")
}
someInstance.add(2,to:3)
Swift 3的更新:
使用Swift 3.0,这将改变,并且在声明函数时必须使用所有参数。参见:
https://github.com/apple/swift-evolution/blob/master/proposals/0046-first-label.md
答案 1 :(得分:0)
swift以不同方式处理方法和函数的参数。使用方法(为了与Objective-C兼容,我怀疑)只省略了初始标记:其余部分是必需的。使用函数时,所有标记都被省略。