如何让我的计算器在 swift 中添加句点?
How can I make my calculator add a Period in swift?
这是我的 UIButton 的代码
@IBAction private func performOperation(sender: UIButton) {
if userIsInTheMiddleOfTyping {
brain.setOperand(displayValue)
userIsInTheMiddleOfTyping = false
}
if let mathematicalSymbol = sender.currentTitle {
brain.performOperation(mathematicalSymbol)
}
displayValue = brain.result
}
这是我的模型或 viewcontroller 代码
private var operations: Dictionary<String,Operation> = [
"π": Operation.Constant(M_PI),
"e": Operation.Constant(M_E),
"√": Operation.UnaryOperation(sqrt),
"cos": Operation.UnaryOperation(cos),
"✕": Operation.BinaryOperation({ [=12=] * }),
"÷": Operation.BinaryOperation({ [=12=] / }),
"+": Operation.BinaryOperation({ [=12=] + }),
"−": Operation.BinaryOperation({ [=12=] - }),
"±": Operation.UnaryOperation({ -[=12=] }),
"=": Operation.Equals,
".": Operation.Period
]
private enum Operation {
case Constant(Double)
case UnaryOperation((Double) -> Double)
case BinaryOperation((Double, Double) -> Double)
case Equals
case Period
}
func performOperation (symbol: String) {
if let operation = operations[symbol] {
switch operation {
case .Constant(let associatedConstantValue):
accumulator = associatedConstantValue
break
case .UnaryOperation(let associatedFunction):
accumulator = associatedFunction(accumulator)
break
case .BinaryOperation(let associatedFunction):
executePendingBinaryOperation()
pending = PendingBinaryOperationInfo(binaryFunction: associatedFunction, firstOperand: accumulator)
break
case .Equals:
executePendingBinaryOperation()
break
case .Period:
displayTextContainsPeriod()
break
}
}
}
private func displayTextContainsPeriod() -> Bool
{
}
我知道要检查是否存在现有句点 我需要检查字符串是否包含子字符串“.”但我不确定如何在我的 func displayTextContainsPeriod
中获取显示文本
假设显示文本在 UITextField 中并且您在故事板中构建它(如果不是,请更新问题)。
您需要给控制器添加一个插座
@IBOutlet var displayTextField: UITextField!
然后,将它连接到故事板中的字段。
在您的代码中,您可以参考self.displayTextField.text
获取UITextField中的当前文本。
您采用了错误的方法。 .
不应该是运算符。你的计算器大脑不应该参与其中。这项工作应该在您的 ViewController
中完成,而不是您的模型。如果 display
尚未包含 .
.
,它应该像数字一样操作并将 .
字符附加到 display
字符串
您需要考虑输入 .
并且用户不在输入数字的过程中的情况。例如,您可能希望以 0.
而不是仅 .
开始显示。
这是我的函数 touchDigit(感谢@vacawama),可能有点乱。
作为初学者,希望得到一些有用的建议。 :)
@IBAction private func touchDigit(sender: UIButton) {
let digit = sender.currentTitle!
if userIsInTheMiddleOfTyping{
let textCurrentlyInDisplay = display.text!
display.text = (digit == "." && textCurrentlyInDisplay.rangeOfString(".") != nil) ? textCurrentlyInDisplay : textCurrentlyInDisplay + digit
}else{
display.text = (digit == ".") ? "0." : digit
}
userIsInTheMiddleOfTyping = true
}
这是我的 UIButton 的代码
@IBAction private func performOperation(sender: UIButton) {
if userIsInTheMiddleOfTyping {
brain.setOperand(displayValue)
userIsInTheMiddleOfTyping = false
}
if let mathematicalSymbol = sender.currentTitle {
brain.performOperation(mathematicalSymbol)
}
displayValue = brain.result
}
这是我的模型或 viewcontroller 代码
private var operations: Dictionary<String,Operation> = [
"π": Operation.Constant(M_PI),
"e": Operation.Constant(M_E),
"√": Operation.UnaryOperation(sqrt),
"cos": Operation.UnaryOperation(cos),
"✕": Operation.BinaryOperation({ [=12=] * }),
"÷": Operation.BinaryOperation({ [=12=] / }),
"+": Operation.BinaryOperation({ [=12=] + }),
"−": Operation.BinaryOperation({ [=12=] - }),
"±": Operation.UnaryOperation({ -[=12=] }),
"=": Operation.Equals,
".": Operation.Period
]
private enum Operation {
case Constant(Double)
case UnaryOperation((Double) -> Double)
case BinaryOperation((Double, Double) -> Double)
case Equals
case Period
}
func performOperation (symbol: String) {
if let operation = operations[symbol] {
switch operation {
case .Constant(let associatedConstantValue):
accumulator = associatedConstantValue
break
case .UnaryOperation(let associatedFunction):
accumulator = associatedFunction(accumulator)
break
case .BinaryOperation(let associatedFunction):
executePendingBinaryOperation()
pending = PendingBinaryOperationInfo(binaryFunction: associatedFunction, firstOperand: accumulator)
break
case .Equals:
executePendingBinaryOperation()
break
case .Period:
displayTextContainsPeriod()
break
}
}
}
private func displayTextContainsPeriod() -> Bool
{
}
我知道要检查是否存在现有句点 我需要检查字符串是否包含子字符串“.”但我不确定如何在我的 func displayTextContainsPeriod
中获取显示文本假设显示文本在 UITextField 中并且您在故事板中构建它(如果不是,请更新问题)。
您需要给控制器添加一个插座
@IBOutlet var displayTextField: UITextField!
然后,将它连接到故事板中的字段。
在您的代码中,您可以参考self.displayTextField.text
获取UITextField中的当前文本。
您采用了错误的方法。 .
不应该是运算符。你的计算器大脑不应该参与其中。这项工作应该在您的 ViewController
中完成,而不是您的模型。如果 display
尚未包含 .
.
.
字符附加到 display
字符串
您需要考虑输入 .
并且用户不在输入数字的过程中的情况。例如,您可能希望以 0.
而不是仅 .
开始显示。
这是我的函数 touchDigit(感谢@vacawama),可能有点乱。 作为初学者,希望得到一些有用的建议。 :)
@IBAction private func touchDigit(sender: UIButton) {
let digit = sender.currentTitle!
if userIsInTheMiddleOfTyping{
let textCurrentlyInDisplay = display.text!
display.text = (digit == "." && textCurrentlyInDisplay.rangeOfString(".") != nil) ? textCurrentlyInDisplay : textCurrentlyInDisplay + digit
}else{
display.text = (digit == ".") ? "0." : digit
}
userIsInTheMiddleOfTyping = true
}