2015-06-06 22 views
6

Aynı isimde fakat farklı parametrelerle 2 fonksiyona sahibim.Swift 1.2 aynı işlev adı ve farklı parametresi ile çalışmaz

Birincisi, bir parametre olarak 2 ikişeyi kabul eden ve bir tane döndüren bir işlevi kabul eder.

İkincisi, 1'i çift kabul eden ve bir tane döndüren bir işlevi parametre olarak kabul eder.

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

Bunu yapabilirim? Bu Xcode 6.4 (beta), bu çalışma ve bana bu hata veriyor vermez üzerinde test Ancak Swift 1.2, Xcode 6.1.1 üzerinde test Swift 1.1, çalışır Çalışabilir ve neden bu oluyor? Kare kökü başka bir şekilde yapabileceğimi biliyorum, o zaman burada, ama sorunun ne olduğunu bilmek istiyorum.

Düzenleme

@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

sonrası yöntemleri ve çizgi olduğunu –

+0

@ WillM.It kullanıcısına yardımcı olmak için bu soru açılır. –

cevap

9
Objective-C hiçbir aşırı yüklenmesini bıraktığından Objective-C görebilirsiniz yöntemleri, aşırı olamaz

:

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

(bu izin verildi gerçeği Swift 1.2'den önce Swift aslında bir hataydı; Swift 1.2, loop'u kapattı ve hatayı düzeltdi.)

Basit çözüm: Bu yöntemleri Objective-C'den gizleyin. Örneğin, ikisini de private olarak bildirin.

Daha zor çözüm: Objective-C'nin bunlardan birini gördüğü adı değiştirin. Örneğin: Swift 2.0 yeni

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

Ya da, Özel yapmak için şimdiye kadar gitmeden bir veya Objective-C den ikisini de gizleyebilirsiniz:

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

Ayrıca, onları @objc (...) 'kullanarak farklı Obj-C seçici isimlerini verebilirsiniz? – nielsbot

+0

@nielsbot Evet, bunlardan sadece bir tanesine farklı bir nesne ismi vermek yeterli olur. Bunu cevaba ekleyeceğim. – matt

+0

Bu gerçek örnek, WWDC 2015 oturumu 401 videosuna dönüştürdü. Şansı nedir? – matt