2015-06-06 11 views
6

Ho 2 funzioni con lo stesso nome ma diversi parametri.Swift 1.2 non funziona con lo stesso nome di funzione e diversi parametri

Il primo accetta come parametro una funzione che accetta 2 doppi e ne restituisce uno.

Il secondo accetta come parametro una funzione che accetta 1 doppio e ne restituisce uno. Questo funziona in Swift 1.1, testato su Xcode 6.1.1, ma in Swift 1.2, testato su Xcode 6.4 (beta), questo non funziona e mi dà questo errore:

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

Che cosa posso fare che questo può funzionare, e perché sta succedendo? So che posso fare la radice quadrata in un altro modo, quindi è qui, ma voglio sapere qual è il problema.

Modifica

@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

metodi postali e linea che l'errore è attivo per aiutare le persone a rispondere a –

+0

@ WillM. È sufficiente? –

risposta

9

Non si può sovraccaricare i metodi che Objective-C può vedere, perché Objective-C non ha alcun sovraccarico:

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

(Il fatto che questo è stato consentito in Swift prima che Swift 1.2 fosse in effetti un bug, Swift 1.2 ha chiuso la scappatoia e risolto il bug.)

Soluzione semplice: nascondi questi metodi da Objective-C. Ad esempio, dichiararli entrambi private.

Soluzione più difficile: cambia il nome con cui Objective-C ne vede uno. Per esempio:

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

Oppure, nuova Swift 2.0, è possibile nascondere uno o entrambi dei quali provenienti da Objective-C, senza andare così lontano da rendere privato:

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

Puoi anche assegnare loro nomi di selettori Obj-C diversi usando '@objc (...)' giusto? – nielsbot

+0

@nielsbot Sì, sarebbe sufficiente dare a uno solo un nome objc diverso. Lo aggiungerò alla risposta. – matt

+0

Questo esempio reale è entrato nel video della sessione 401 del WWDC 2015. Quali sono le probabilità? – matt

Problemi correlati