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"