Swift error: отсутствует метка аргумента "name:" в вызове
я узнаю о аргументах по умолчанию, и я сел на мель чего-то странного:
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")
но я не поймите, почему это необходимо.
3 ответов
функции 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")
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
Я просто хотел добавить, что теперь ваш код
func greet(name: String = "world") {
print("hello \(name)")
}
greet("jiaaro")
отлично работает в xcode, я только что изменил " println "на"print"