2015-05-18 3 views
0

Я изучаю и пытаюсь построить калькулятор. Я пытаюсь создать функцию квадратного корня. Я уже создал умножение, добавление, вычитание и деление и функцию с именем performOperation с двумя удвоениями. Я знаю, что в Swift я могу создать еще одну функцию под названием performOperation с одним двойным номером, а достаточно умен, чтобы использовать правильную функцию для функции квадратного корня, но я получаю ошибку во второй строке func performOperation, которая говорит «метод« выполнить операцию »с селектор конфликтует с предыдущим объявлением с тем же селектором." Что я делаю неправильно?Swift не дал мне 2 селектора с тем же именем

код ниже:

import UIKit 

class ViewController: UIViewController 
{ 
@IBOutlet weak var display: UILabel! 

var userIsTyping = false 

@IBAction func appendDigit(sender: UIButton) { 
    let digit = sender.currentTitle! 
    if userIsTyping { 
     display.text = display.text! + digit 
    } else { 
     display.text = digit 
     userIsTyping = true 
    } 

} 

@IBAction func operate(sender: UIButton) { 
    let operation = sender.currentTitle! 
    if userIsTyping { 
     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() 
    } 
} 

var operandStack = Array<Double>() 

@IBAction func enter() { 
    userIsTyping = false 
    operandStack.append(displayValue) 
    println("operandStack = \(operandStack)") 
} 

//Changes String Value to a Double 
var displayValue: Double { 
    get { 
     return NSNumberFormatter().numberFromString(display.text!)!.doubleValue 
    } 
    set { 
     display.text = "\(newValue)" 
     userIsTyping = false 
    } 
} 
} 
+0

yah Конечно, я не позволю вам или даже другому языку не позволять такой вещи использовать одно и то же имя для двух разных вещей. complier будет путать, если он позволяет вызвать какую функцию где. –

+0

@FattiKhan: Неправда. Многие языки поддерживают перегрузку функций, где у вас есть функции с тем же именем, которые дифференцируются по сигнатуре аргумента. Я считаю, что Свифт тоже. – Thilo

+0

@Thilo http://stackoverflow.com/questions/29457720/compiler-error-method-with-objective-c-selector-conflicts-with-previous-declara –

ответ

1

Изменить это:

func performOperation(#operationWithOneParametr: Double -> Double) 

для этого:

func performOperation(#operationWithTwoParameters: (Double) -> Double) 

Все Затворы должны быть как: (parameters) -> return type

Более подробно о Клоса УРЭС загляните в яблочной документации: The Swift Programming Language - Closures

Также функции имеют одинаковые сигнатуры, которые не поддерживают Свифт, чтобы исправить это объявить эти функции следующим образом:

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

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

«#» заставляет первый параметр является частью подписи, что делает две разности сигнатур.

+0

нашел ответ здесь: http://stackoverflow.com/questions/29457720/compiler-error-method-with-objective-c-selector-conflicts-with- previous-declara – shibboleth

+0

@shibboleth, извините, я просто заметил, что у этих двух есть одна и та же подпись, я редактирую ответ, чтобы помочь вам в этом. – Icaro

Смежные вопросы