2014-06-10 6 views
6

नामकरण मुझे लगता है मैं एक चेतावनी शीर्षक शीर्षक #title रूप में और अधिक संक्षेप में व्यक्त किया जा सकता है जब मैंविधि मुद्दे स्विफ्ट

func insertFileWithService(service: GTLServiceDrive, 
    title title: String, 

टाइप

+ (void)insertFileWithService:(GTLServiceDrive *)service 
        title:(NSString *)title 

करने के लिए एक स्विफ्ट विधि समतुल्य बनाने के लिए इच्छा

लेकिन जब मैं इसे में बदलता हूं func insertFileWithService (सेवा: GTLServiceDrive, # शीर्षक: स्ट्रिंग

मैं एक चेतावनी बाहरी पैरामीटर शीर्षक में '#' पहले से ही कीवर्ड तर्क नाम

मैं इन चेतावनियों की उपेक्षा और बीटा में एक बग के लिए इसे चाक चाहिए है मिल सकता है?

+0

तो अगर आप कार्य करें: ' func insertFileWithService (सेवा: GTLServiceDrive, # शीर्षक: स्ट्रिंग) 'आपको वह चेतावनी मिलती है? – Firo

+3

क्या यह एक समारोह या विधि है? Http://stackoverflow.com/a/24046893/390581 देखें - वे अलग-अलग व्यवहार करते हैं। –

+0

हाँ, अगर मैं वैश्विक के बजाय फ़ंक्शन का क्लास सदस्य हूं तो मैं इसे पुन: पेश कर सकता हूं। रयान, आप न्यूनतम प्रश्न दिखाने के लिए अपने प्रश्न का विस्तार करना चाह सकते हैं। लेकिन मैं कहूंगा कि यह एक एक्सकोड बग है। –

उत्तर

5

मैं नहीं मानता कि यह एक बग है, वास्तव में, यह कैसे काम करने के लिए डिजाइन किया गया था भाषा है:


से एप्पल के सामान (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-XID_300):

class Counter { 
    var count: Int = 0 
    func incrementBy(amount: Int, numberOfTimes: Int) { 
     count += amount * numberOfTimes 
    } 
} 

यह incrementBy विधि में दो पैरामीटर हैं- राशि और संख्याऑफटाइम्स। डिफ़ॉल्ट रूप से, स्विफ्ट केवल स्थानीय नाम के रूप में राशि का व्यवहार करता है, लेकिन स्थानीय और बाहरी नाम दोनों के रूप में संख्याऑफटाइम का इलाज करता है। इस प्रकार आप विधि कॉल:

let counter = Counter() 
counter.incrementBy(5, numberOfTimes: 3) 
// counter value is now 15 

आप, पहले तर्क मूल्य के लिए एक बाहरी पैरामीटर नाम को परिभाषित करने क्योंकि अपने उद्देश्य समारोह नाम incrementBy से स्पष्ट है की जरूरत नहीं है। दूसरी तर्क, हालांकि, विधि को कॉल करते समय इसका उद्देश्य स्पष्ट करने के लिए बाह्य पैरामीटर नाम से योग्यता प्राप्त होती है।

इस डिफ़ॉल्ट व्यवहार को प्रभावी ढंग से विधि व्यवहार करता है जैसे कि आप तरीके एक क्लास के भीतर, करने के लिए पहले पैरामीटर चूक के लिए numberOfTimes पैरामीटर से पहले एक हैश प्रतीक (#) लिखा था


मूल रूप से, केवल एक आंतरिक पैरामीटर नाम। बाद के पैरामीटर नाम बाहरी नामों के लिए डिफ़ॉल्ट होते हैं जहां बाहरी नाम डिफ़ॉल्ट रूप से पैरामीटर नाम होता है। इस प्रकार, # अनावश्यक है।

func insertFileWithService(service: GTLServiceDrive, title: String) 

कार्य के लिए

func insertFileWithService(service: GTLServiceDrive, #title: String) 

के बराबर तरीके, नहीं के लिए है। यही कारण है कि आपको चेतावनी मिल रही है।

+0

मैंने इसे पुस्तक में पाया "यदि आप फ़ंक्शन पैरामीटर के लिए बाहरी पैरामीटर नाम प्रदान करना चाहते हैं, और स्थानीय पैरामीटर नाम पहले से ही उपयोग करने के लिए उपयुक्त नाम है, तो आपको उस पैरामीटर के लिए दो बार एक ही नाम लिखने की आवश्यकता नहीं है। इसके बजाय, एक बार नाम लिखें, और हैश प्रतीक (#) के साथ नाम उपसर्ग करें। यह स्विफ्ट को उस नाम का उपयोग स्थानीय पैरामीटर नाम और बाहरी पैरामीटर नाम दोनों के रूप में करने के लिए कहता है। " से उद्धरण: ऐप्पल इंक" स्विफ्ट प्रोग्रामिंग भाषा। "IBooks। https://itunes.apple.com/il/book/swift-programming-language/id881256329?mt=11 –

+0

क्या यह केवल फ़ंक्शंस पर लागू होता है और तरीकों से नहीं, यदि मैं आपको सही ढंग से समझता हूं –

+0

सही, आपके पास उद्धरण फ़ंक्शन के लिए है तरीकों के लिए नहीं। विधियों के लिए, स्थानीय पैरामीटर नाम को पहले पैरामीटर को छोड़कर सभी पैरामीटर के लिए बाह्य पैरामीटर नाम माना जाता है। मेरी पोस्ट से उद्धृत पाठ देखें।विधियों के लिए, # दूसरे पैरामीटर के लिए निहित है, यही कारण है कि आपको चेतावनी मिल रही है, '# 'अनावश्यक है और संकलक चाहता है कि आप यह सुनिश्चित कर लें कि आप जानते हैं कि आप क्या करने की कोशिश कर रहे हैं। – jacobhyphenated

0

बंद हैश निशान छोड़ दो और बस "शीर्षक: स्ट्रिंग" का उपयोग

+0

नहीं, यह नहीं होगा। "शीर्षक शीर्षक: स्ट्रिंग" बिल्कुल "शीर्षक: स्ट्रिंग" के समान है। – Bill

0

स्विफ्ट आप बाहर से समारोह के अंदर अलग ढंग से तर्क नाम के लिए अनुमति देता है।

आप इन "बाहरी पैरामीटर नाम" का उपयोग करेंगे जब आप चाहते थे कि तर्क के अंदर तर्क अलग-अलग नाम हो। the book से:

कभी कभी यह प्रत्येक पैरामीटर नाम के लिए जब आप प्रत्येक तर्क आप कार्य करने के लिए पारित करने के उद्देश्य से संकेत मिलता है एक समारोह फोन, उपयोगी है।

यदि आप अपने फ़ंक्शन को कॉल करते समय पैरामीटर नाम प्रदान करने के लिए अपने फ़ंक्शन के उपयोगकर्ता चाहते हैं, तो स्थानीय पैरामीटर नाम के अतिरिक्त प्रत्येक पैरामीटर के लिए बाहरी पैरामीटर नाम परिभाषित करें।

जब से तुम एक ही नाम दोनों आंतरिक बाह्य रूप यहाँ का उपयोग कर रहे हैं, "शीर्षक है," तुम बाहरी पैरामीटर नाम को छोड़ सकते हैं के रूप में स्विफ्ट पता चलता है और एक ही नाम के साथ एक संदर्भित नामित बाहरी पैरामीटर को निरूपित करने के # उपसर्ग का उपयोग आंतरिक रूप से। किताब से

उदाहरण:

func containsCharacter(#string: String, #characterToFind: Character) -> Bool { 
    for character in string { 
     if character == characterToFind { 
      return true 
     } 
    } 
    return false 
} 
+0

यह बहुत ही उदाहरण पैरामीटर में "अतिरिक्त '#' त्रुटि देगा: 'characterToFind' पहले से ही कीवर्ड तर्क नाम है" लेखन के समय। – Gomfucius

0

नाम अपने विधि इतनी तरह:

@objc(insertFileWithService:title:) 
func insertFile(service: GTLServiceDrive, title: String) 
फिर स्विफ्ट से

, इसलिए है कि यह फोन:

obj.insertFile(serviceDrive, title: "Title") 

और उद्देश्य सी में:

[obj insertFileWithService:serviceDrive title: @"Title"]; 
+0

क्यों '@ objc' एनोटेशन यहाँ? बस वर्ग ('@objc वर्ग ... ') को एनोटेट करें। –

+0

@ जीन-फिलिपपेलेट एनोटेशन स्विफ्ट नाम अजीब बनाने के बिना इसे और अधिक उद्देश्य सी दोस्ताना नाम देना है। –

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