2015-06-06 10 views
6

Mam 2 funkcje o tej samej nazwie, ale o różnych parametrach.Swift 1.2 nie działa z tą samą nazwą funkcji i innym parametrem

Pierwszy przyjmuje jako parametr funkcję, która akceptuje 2 podwójne i zwraca jedną.

Drugi przyjmuje jako parametr funkcję, która przyjmuje 1 podwójną wartość i zwraca jedną. Działa to w Swift 1.1, testowane na Xcode 6.1.1, jednak w Swift 1.2, testowany na Xcode 6.4 (beta), to nie działa i daje mi ten błąd:

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

Co mogę zrobić, że ta może działać i dlaczego tak się dzieje? Wiem, że mogę zrobić pierwiastek kwadratowy inaczej niż to jest tutaj, ale chcę wiedzieć, jaki jest problem.

Edit

@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

metody post i linia Wystąpił błąd, aby ludzie mogli odpowiedzieć na –

+0

@ WillM.It wystarczy? –

Odpowiedz

9

nie można przeciążać metody, Objective-C widać, bo Objective-C nie ma przeciążenia:

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

(Fakt, że zostało to dozwolone w Swift zanim Swift 1.2 był w rzeczywistości błędem, Swift 1.2 zamknął luki i naprawił błąd.)

Proste rozwiązanie: ukryj te metody przed Objective-C. Na przykład zadeklaruj je jako private.

Bardziej skomplikowane rozwiązanie: zmień nazwę, pod jaką Objective-C widzi jedną z nich. Na przykład:

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

Lub nowego w Swift 2.0, można ukryć jedno lub oboje z Objective-C bez wchodzenia tak daleko, by uczynić go private:

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

Można również podać im różne nazwy selektorów Obj-C za pomocą '@objc (...)', prawda? – nielsbot

+0

@nielsbot Tak, wystarczy podać jedną z nich inną nazwę objazdu. Dodam to do odpowiedzi. – matt

+0

Ten faktyczny przykład znalazł się w wideo sesji 401 WWDC 2015. Jakie są szanse? – matt

Powiązane problemy