【问题标题】:Swift error: missing argument label 'name:' in callSwift 错误:调用中缺少参数标签“名称:”
【发布时间】:2014-06-04 23:29:09
【问题描述】:

我正在学习默认参数,但遇到了一些奇怪的事情:

import UIKit

func greet(name: String = "world") {
    println("hello \(name)")
}

greet("jiaaro")

这会引发错误:

Playground execution failed: error: <REPL>:9:7: error: missing argument label 'name:' in call
greet("jiaaro")
      ^
      name:

我知道它需要greet(name: "jiaaro"),但我明白为什么有必要这样做。

【问题讨论】:

  • @jtbandes 这个问题比较老,我在第一次提出该问题时(准确地说是 6 分钟后)链接的问题上发布了一个指向它的链接(在 cmets 中)

标签: swift


【解决方案1】:

Swift 函数可以指定本地和外部参数名称:

func greet(who name: String = "world") {
    println("hello \(name)")
}

// prints "hello world"
greet()

// prints "hello jiaaro"
greet(who:"jiaaro")

// error
greet("jiaaro")

// error
greet(name: "jiaaro")

要退出此行为,您可以在外部名称中使用下划线。请注意,第一个参数隐式使用“无外部名称”行为:

func greet(name: String = "world", _ hello: String = "hello") {
    println("\(hello) \(name)")
}

// prints "hello world"
greet()

// prints "hello jiaaro"
greet("jiaaro")

// prints "hi jiaaro"
greet("jiaaro", "hi")

// error
greet(name: "jiaaro")

现在在 Swift 2.0 中不允许使用以下内容,请参阅下面的等效代码。

您可以使用# 前缀为第一个参数使用相同的本地和外部名称:

func greet(#name: String = "world", hello: String = "hello") {
    println("\(hello) \(name)")
}

// prints "hi jiaaro"
greet(name: "jiaaro", hello: "hi")

Swift 2.0 代码:

func greet(name name: String = "world", hello: String = "hello") {
    println("\(hello) \(name)")
}

// prints "hi jiaaro"
greet(name: "jiaaro", hello: "hi")

【讨论】:

  • 这两行有什么区别? // 打印 "hello jiaaro" greet("jiaaro") // 错误 greet("jiaaro")
  • @SamBudda 哎呀……复制/粘贴错误 - 我不得不继续重新输入这些东西,因为操场在我身上崩溃了。忽略了第三次或第四次重新制作示例:)
  • XCode 6.1 不再需要第一个参数的名称标签。事实上,如果你使用标签,你会得到一个警告:Extraneous '_' in parameter: 'name' has no keyword argument name
  • @MikeLischke 好的,谢谢。那么方法和函数现在具有相同的行为了吗?
【解决方案2】:

Swift 默认需要参数标签,因为它支持具有多个初始化器的类。参数标签的好处来自于 Swift 推断使用哪个初始化器的能力;不仅是参数类型,还有参数名称。

struct Celsius {
    var temperatureInCelsius: Double = 0.0

    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }

    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
}

let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius is 100.0

let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius is 0.0

查看此页面了解更多详情:https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_272

【讨论】:

  • 为了更好的客观 C 兼容性 ;)
  • 那个也是,我没想到!
【解决方案3】:

我现在只想添加你的代码

func greet(name: String = "world") {
    print("hello \(name)")
}

greet("jiaaro")

在 xcode 中工作正常,我只是将“println”更改为“print”

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多