gpt4 book ai didi

swift - 如何将存储在变量中的字符串快速转换为可执行代码文本?

转载 作者:行者123 更新时间:2023-11-30 10:39:26 26 4
gpt4 key购买 nike

我一直在尝试在 xcode 9 中开发一个功能计算器(目前看来是徒劳的),但我需要以某种方式将字符串转换为代码文本文件。这是我的 View Controller 文件(对极其草率和杂乱的代码表示歉意......):

import UIKit

class ViewController: UIViewController {

var calculation_string : String = ""
var displayed = "0"

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

@IBOutlet weak var calc_display: UILabel!

@IBAction func button_pressed(_ sender: UIButton) {
calc_display.text = "asdf"
print(sender.tag)
calculation_string = calculation_string + String(identify(btn_tag: sender.tag))
print(calculation_string)
print(identify(btn_tag: sender.tag))

}



//1-receive and identify the data submitted.
//2-append the string used for calculations from either end; or delete it alltogether depending on the button pressed.
//display on the display area.

func identify(btn_tag: Int) -> String {
if btn_tag == 1 {
return "1"
}
if btn_tag == 2 {
return "2"
}
if btn_tag == 3 {
return "3"
}
if btn_tag == 4 {
return "4"
}
if btn_tag == 5 {
return "5"
}
if btn_tag == 6 {
return "6"
}
if btn_tag == 7 {
return "7"
}
if btn_tag == 8 {
return "8"
}
if btn_tag == 9 {
return "9"
}
if btn_tag == 10 {
return "0"
}
if btn_tag == 11 {
return "."
}
if btn_tag == 13 {
return "+"
}
if btn_tag == 14 {
return "-"
}
if btn_tag == 15 {
return "*"
}
if btn_tag == 16 {
return "/"
}
if btn_tag == 17 {
return "*(0.01)"
}
else {
return ""
}
}
func change_sign() {
calculation_string = "-(" + calculation_string + ")"
}
func equals() {

//makes the value displayed equal to the calculation string
//or returns 'error' if the statement makes no sense or is erroneous.
}
func reset() {
calculation_string = ""
}


}

我需要将此“calculation_string”变量转换为代码,以便我可以执行计算,然后使用“displayed”变量显示它。有谁知道该怎么做吗?

如果有人考虑评估和批评我的代码,并提出其他有效的方法,我会同样高兴。再次对正在编写的代码的草率表示歉意。

干杯!

最佳答案

Swift 没有像 Lisp 那样的 eval 函数。您无法将一堆 Swift 代码创建为字符串,然后在运行时执行它。相反,您需要自己解析字符串并对其进行评估。

这并不是小事,但 Nick Lockwood 创建了一个非常好的库,名为 Expression就可以了。您不必使用该库,但它很好地介绍了如何解决问题。它包含大约 1500 行 Swift 代码,您可以通过非常简单的方式了解它如何标记和评估字符串。 (它有一些性能优化,如果没有它可能会更容易理解,但我仍然希望您可以通过一些工作来完成。)

如果您想从头开始构建这种东西,通常首先探索构建一个 RPN ( Reverse Polish Notation ) 计算器。这是一个基于堆栈的计算器,通常比“中缀”计算器更容易实现。您可以输入 1 2 +,而不是 1 + 2,并且 + 始终消耗堆栈上的最后两个值。如果您想了解解析器和求值器,RPN 是一个很好的起点。只是实现起来要简单得多。

还有内置的 NSExpression 可以为您完成此操作并且是内置的,但在 Swift 中使用它很痛苦,我真的不推荐它,除非你只需要非常快的东西。

关于swift - 如何将存储在变量中的字符串快速转换为可执行代码文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57191486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com