当func调用

时间:2015-07-28 06:00:13

标签: ios swift

我是swift的新人,我正在跟着苹果医生研究它。 apple doc

func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", day: "Tuesday")

我只是从apple doc复制上面的代码并尝试在游乐场中运行,但在最后一行它会给我语法错误,并告诉我删除 day:。 当我删除 day:时,请完美地调用其运行

greet("Bob", "Tuesday")

苹果医生是否有任何错误,或者我做错了什么?

6 个答案:

答案 0 :(得分:2)

这些是Swift“函数”而不是“方法”。它们不需要参数名称。您仍然可以在声明中添加它们以便于阅读,但在调用时无法使用它。

另一方面,类“方法”被命名并按预期工作。

如果您在呼叫时仍需要命名参数,请尝试以下方法:

func greet(name: String, #day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", day: "Tuesday")

这将为您提供预期的结果。

在文档中找到:

  

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

关于方法和功能的说明: 简单地说,方法属于一个类。功能没有。来自文档:

  

函数是执行特定代码的自包含代码块   任务。您为函数指定一个名称,以标识它的作用,以及   此名称用于“调用”函数以执行其任务时   需要的。

请注意,Swift 2.0在方法调用和函数调用之间没有区别,所以在Swift 2.0中,你的方式是有效的。

答案 1 :(得分:2)

根据函数的定义位置(以及初始化程序的不同),命名函数的参数的工作方式不同

方式,你定义函数是全局的,在类之外。在这种情况下,函数调用不会命名参数。

如果你要在一个类中定义函数,你的第一次尝试将完全正常。在类(方法)中的函数中,您可以命名除第一个参数之外的参数。如果你想拥有名字,你也可以使用

func greet(#firstParameter: String, secondParameter: String) ...

要完成所有这些,初始值设定项需要所有已命名的参数。即使是第一个甚至没有#。

听起来有点令人困惑吗?好吧,Apple有同样的看法,根据WWDC 2015上的说法,他们改变了Swift 2中的行为并使其更加一致。

答案 2 :(得分:1)

在功能中:

func greet(name: String, day: String) -> String {
}

"名称"和" day"变量不是Obj C中的标签。你可以写" day"标签为:

func greet(name: String, day day: String) -> String {
}

答案 3 :(得分:1)

你必须明白像Swift这样的新语言必将改变。这是其中一项变更,它是在WWDC 2015期间推出的。

Apple统一了您定义和调用函数和方法的方式,因此行为是相同的。他们从#定义中完全删除了func,并要求将func的第一个参数的名称包含在名称中,并且所有其他参数都可以选择是否有名字。

这些是func中有效Swift 2.0声明的示例,将在Xcode 7和iOS 9中发布。

func moveShapeToPosition(position: CGPoint, andScaleBy scale: CGFloat)
func moveShapeToPosition(position: CGPoint, scale: CGFloat)
func moveShapeToPosition(position: CGPoint, _ scale: CGFloat)

并打电话给他们。

moveShapeToPosition(CGPoint(x: 0, y: 0), andScaleBy: 1)
moveShapeToPosition(CGPoint(x: 0, y: 0), scale: 1)
moveShapeToPosition(CGPoint(x: 0, y: 0), 1)

答案 4 :(得分:0)

Swift的版本与众不同。

我在Xcode 7.0 Beta中运行该演示,它运行完美。

此外,当我尝试在Xcode 7.0 Beta中调用greet之类的greet("Bob", "Tuesday")时,它会给我一个day:缺失的错误。

enter image description here

然而,当我在Xcode 6.4中运行它时,它和你的一样抱怨。

enter image description here

答案 5 :(得分:0)

在Swift中,函数和方法是不同的。你可以找到详细的answer here

您必须创建function,这意味着您可能已在Viewdidload内创建了它(这是我的猜测)。所以你不能专门给出函数参数名。

如果您已创建method(在viewdidload之外),那么您可以像尝试一样打电话

greet("Bob", day: "Tuesday")

检查外部参数名称的Shorthand External Parameter Names