2014-06-04 15 views
9

में मैं डिफ़ॉल्ट तर्क के बारे में सीख रहा हूँ और मैं कुछ अजीब से फंस गया भागा:स्विफ्ट त्रुटि: तर्क लेबल अनुपलब्ध 'नाम:' कॉल

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

मैं:

import UIKit 

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

greet("jiaaro") 

यह एक त्रुटि फेंकता समझें कि यह greet(name: "jiaaro") चाहता है लेकिन मैं समझ नहीं पा रहा हूं कि यह क्यों आवश्यक होना चाहिए।

+0

संभावित डुप्लिकेट [स्विफ्ट: गायब तर्क लेबल 'xxx' कॉल में] (http://stackoverflow.com/questions/24050844/swift-missing-argument-label-xxx-in-call) – jtbandes

+0

@ इस सवाल को jtbandes मैं जब आप उस प्रश्न से पहले पूछे गए थे (सटीक होने के 6 मिनट बाद;) – Jiaaro

उत्तर

11

स्विफ्ट कार्यों स्थानीय और बाहरी तर्क नाम निर्दिष्ट कर सकते हैं:

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

आप पहले पैरामीटर के लिए एक ही स्थानीय और बाहरी नाम का उपयोग करने # उपसर्ग उपयोग कर सकते हैं

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

इन दो पंक्तियों के बीच क्या अंतर है, तो मैंने आपके द्वारा लिंक किए गए प्रश्न पर एक लिंक पोस्ट किया है (टिप्पणियों में)। // प्रिंट "हैलो jiaaro" अभिवादन करना ("jiaaro") // त्रुटि अभिवादन करना ("jiaaro") –

+0

@SamBudda ओह ... कॉपी/पेस्ट त्रुटि - मैं इस सामान पुन: लिखने क्योंकि खेल का मैदान मुझ पर दुर्घटनाग्रस्त हो गया था रखना था । इस बात से पता चला कि तीसरे या चौथे समय उदाहरण को फिर से बनाना :) – Jiaaro

+0

एक्सकोड 6.1 को पहले तर्क के लिए नाम लेबल की आवश्यकता नहीं है। वास्तव में आपको एक चेतावनी मिलती है यदि आप लेबल का उपयोग करते हैं: पैरामीटर में अतिरिक्त '_': 'name' में कोई कीवर्ड तर्क नाम नहीं है –

3

स्विफ्ट को डिफ़ॉल्ट रूप से तर्क लेबल की आवश्यकता होती है, क्योंकि यह एकाधिक प्रारंभकर्ताओं के साथ कक्षाओं का समर्थन करता है। तर्क लेबल का लाभ स्विफ्ट की क्षमता से आता है कि किस प्रारंभकर्ता का उपयोग करना है; न केवल तर्क प्रकार से, बल्कि तर्क का नाम भी।

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

+1

और बेहतर उद्देश्य सी संगतता के लिए;) – Jiaaro

+0

वह भी, मैंने इसके बारे में नहीं सोचा था! – HZN

1

मैं सिर्फ इतना है कि अब अपने कोड

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

greet("jiaaro") 

xcode में ठीक काम करता है जोड़ना चाहते थे, मैं सिर्फ "प्रिंट" के साथ "println" में बदल

संबंधित मुद्दे