2015-06-06 10 views
6

मेरे पास एक ही नाम के साथ 2 फ़ंक्शन हैं लेकिन विभिन्न पैरामीटर हैं।स्विफ्ट 1.2 समान फ़ंक्शन नाम और विभिन्न पैरामीटर के साथ काम नहीं कर रहा है

पहला पैरामीटर एक पैरामीटर के रूप में स्वीकार करता है जो 2 युगल स्वीकार करता है और एक देता है।

दूसरा पैरामीटर के रूप में स्वीकार करता है जो एक कार्य को स्वीकार करता है जो 1 डबल स्वीकार करता है और एक देता है। यह स्विफ्ट 1.1, Xcode 6.1.1 पर परीक्षण में काम करता है, स्विफ्ट 1.2 में हालांकि, Xcode 6.4 (बीटा), यह काम नहीं करता है और मुझे इस त्रुटि देता है पर परीक्षण किया:

Method 'performOperation' with Objective-C selector 'performOperation:' conflicts with previous declaration with the same Objective-C selector

मैं यह है कि क्या कर सकते हैं काम कर सकते हैं, और यह क्यों हो रहा है? मुझे पता है कि मैं वर्ग रूट को एक और तरीके से कर सकता हूं, तो यह यहां है, लेकिन मैं जानना चाहता हूं कि समस्या क्या है।

संपादित

@IBAction func operate(sender: UIButton) { 
     let operation = sender.currentTitle! 
     if userIsInMiddleOfTypingANumber{ 
      enter() 
     } 
     switch operation{ 
     case "×" : performOperation {$0 * $1} 
     case "÷" : performOperation {$1/$0} 
     case "+" : performOperation {$0 + $1} 
     case "−" : performOperation {$1 - $0} 
     case "√" : performOperation {sqrt($0)} 
     default : break 
     } 
    } 

    func performOperation(operation : (Double,Double) -> Double){ 
     if operandStack.count >= 2{ 
      displayValue = operation(operandStack.removeLast(),operandStack.removeLast()) 
      enter() 
     } 
    } 

    func performOperation(operation : Double -> Double) { 
     if operandStack.count >= 1{ 
      displayValue = operation(operandStack.removeLast()) 
      enter() 
     } 
    } 
+0

पद के तरीकों और लाइन है कि –

+0

@ विलम का जवाब देने में लोगों की सहायता करने के लिए त्रुटि चालू है। यह पर्याप्त है? –

उत्तर

9

आप तरीकों कि ऑब्जेक्टिव-सी देख सकते हैं, ओवरलोड नहीं कर सकते क्योंकि ऑब्जेक्टिव-सी कोई अधिक भार है:

func performOperation(operation : (Double,Double) -> Double){ 
} 
func performOperation(operation : Double -> Double) { 
} 

(तथ्य यह है कि इस में अनुमति दी गई थी स्विफ्ट 1.2 से पहले स्विफ्ट वास्तव में एक बग था; स्विफ्ट 1.2 ने छेड़छाड़ बंद कर दी और बग तय किया।)

सरल समाधान: उद्देश्य-सी से इन तरीकों को छुपाएं। उदाहरण के लिए, उन्हें private दोनों घोषित करें।

अधिक कठिन समाधान: उस नाम को बदलें जिसके द्वारा उद्देश्य-सी उनमें से एक को देखता है। उदाहरण के लिए:

func performOperation(operation : (Double,Double) -> Double){ 
} 
@objc(performOperation2:) func performOperation(operation : Double -> Double) { 
} 

या, स्विफ्ट 2.0 में नया है, तो आप अब तक जा रहा के रूप में यह निजी बनाने के लिए बिना एक या ऑब्जेक्टिव-सी से उन दोनों को छिपा सकते हैं:

@nonobjc func performOperation(operation : (Double,Double) -> Double){ 
} 
func performOperation(operation : Double -> Double) { 
} 
+0

आप उन्हें '@objc (...)' का उपयोग करके अलग ओब्जे-सी चयनकर्ता नाम भी दे सकते हैं? – nielsbot

+0

@nielsbot हां, उनमें से केवल एक अलग ओबीजेसी नाम देने के लिए पर्याप्त होगा। मैं इसे उत्तर में जोड़ दूंगा। – matt

+0

इस वास्तविक उदाहरण ने इसे डब्ल्यूडब्ल्यूडीसी 2015 सत्र 401 वीडियो में बनाया। कितनी संभावनाएं हैं? – matt

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