2014-06-04 33 views
9

I varsayılan argümanlar öğrenmeye ve ben garip bir şey karaya oturdu:Swift hatası: argüman etiketi eksik 'ismi:' çağrısı

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

I: Bu bir hata atar

import UIKit 

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

greet("jiaaro") 

o greet(name: "jiaaro") istediğini anlıyoruz ama bu neden gerekli anlamıyorum yapmak .

+0

olası [dublaj: arama argümanında 'xxx' eksik argümanı etiketi] (http://stackoverflow.com/questions/24050844/swift-missing-argument-label-xxx-in-call) – jtbandes

+0

@jtbandes bu soru ben daha büyük, ve ben bu soru ilk sorulduğunda (sen kesin olarak 6 dakika sonra) bağlandığınız soru üzerine bir yorum gönderdi(); – Jiaaro

cevap

11

Swift fonksiyonları yerel ve dış argüman adları belirtebilirsiniz:

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") 

Bu davranışa devre dışı bırakmak amacıyla harici adı için bir alt çizgi kullanabilirsiniz.

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

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

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") 

The following is now disallowed in Swift 2.0, see below for equivalent code.

İlk parametre için aynı yerel ve dış adı kullanmak # öneki kullanabilirsiniz: İlk parametre örtülü olarak "hayır harici adı" davranışı kullandığını unutmayın birden çok başlatıcıları ile sınıflarını destekler çünkü

Swift 2.0 code:

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

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

Bu iki satır arasındaki fark nedir? // baskılar "merhaba jiaaro" Greet ("jiaaro") // hata Greet ("jiaaro") –

+0

@SamBudda Hata ... kopyala/yapıştır hatası - Ben oyun alanı üzerime çöküyor çünkü bu şeyleri yeniden yazmayı tutmak zorunda . Örnek 3'ü yeniden oluştururken 3. veya 4. kez gözden kaçırdı. – Jiaaro

+0

XCode 6.1 artık ilk argüman için bir isim etiketi gerektirmiyor. Eğer bir etiket kullanırsanız aslında bir uyarı alırsınız: Parametrede Extraneous '_': 'name' anahtar kelime argüman adı yok –

3

Swift, varsayılan olarak argüman etiketleri gerektirir. Argüman etiketlerinin yararı, Swift'in hangi başlatıcıyı kullanacağını belirleme yeteneğinden gelir; sadece argüman türü ile değil, argüman adı da.

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 

fazla ayrıntı için bu sayfaya bakın: https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_272

+1

Ve daha iyi objektif C uyumluluğu için;) – Jiaaro

+0

Bu da ben öyle düşünmedim! – HZN

1

Sadece

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

greet("jiaaro") 

xcode çalışıyor şimdi kodunuzu eklemek istedim, ben sadece "baskı" ile "println" olarak değiştirildi

İlgili konular