Xcode 使用+&引用;如雨燕中的弦

Xcode 使用+&引用;如雨燕中的弦,xcode,swift,macos,Xcode,Swift,Macos,我试图用swift制作一个ONP转换器,所以我为操作符制作了一个映射字符串->Int: ops[“+”]=1 ops[“-”]=1 ops[“*”]=2 ops[“/”]=2 不幸的是,当我尝试调用ops[“+”]时,我得到了零。调试程序说“+”和“-”作为键“无法读取数据”。“*”和“/”可以正常工作。 在+-之前是否有任何特殊字符输入以用作字符串 编辑 classonp{ 让方程:字符串? 变量堆栈=[String]() var knownOperators=[String:Int]()

我试图用swift制作一个ONP转换器,所以我为操作符制作了一个映射字符串->Int:

  • ops[“+”]=1
  • ops[“-”]=1
  • ops[“*”]=2
  • ops[“/”]=2
不幸的是,当我尝试调用ops[“+”]时,我得到了零。调试程序说“+”和“-”作为键“无法读取数据”。“*”和“/”可以正常工作。 在+-之前是否有任何特殊字符输入以用作字符串

编辑

classonp{
让方程:字符串?
变量堆栈=[String]()
var knownOperators=[String:Int]()
init(方程:字符串?){
自我方程
initOperators()
}
func initOperators(){
knownOperators[“+”]=1
知识操作员[”−"] = 1.
knownOperators[“×”]=2
知识操作员[“/”]=3
}
func transform()->[String]?
{
变量结果=[String]()
如果let序列=SpliteEquation(){
按顺序进行操作{
如果let operatorPriority=knownooperators[op]
{
而(!stack.isEmpty&&(operatorPriority[String])?
{
返回公式?.characters.split(“”).map(String.init)
}
}

我已将您的代码复制到游乐场,并呼叫:

let onp = ONP(equation: "3 + 4 * 2")
onp.knownOperators["+"] // 1
onp.knownOperators["−"] // 1
onp.knownOperators["×"] // 2
onp.knownOperators["/"] // 3
如您所见,我得到了正确的值,请确保您使用了完全相同的字符和相同的unicode值。您可以使用以下内容进行检查:

extension Character {
    var unicodeScalarsValue: UInt32 {
        return String(self).unicodeScalars.first!.value
    }
}
Character("-").unicodeScalarsValue //normal minus = 45
Character("−").unicodeScalarsValue //your minus = 8722

在源代码中使用特殊字符时要非常小心。其他开发人员可能不知道。例如,在我看来,乘法符号看起来像是小写的
x
。几个月后,您可能会忘记您使用的确切字符,因此您必须来回切换以进行复制和粘贴

最好将它们定义为常量:

enum KnownOperator: String {
    case Plus = "+"        // U+2B
    case Minus = "−"       // U+2212
    case Multiply = "×"    // U+D7
    case Divide = "/"      // U+2F
}

let knownOperators: [KnownOperator: Int] = [.Plus: 1, .Minus: 1, .Multiply: 2, .Divide: 2]

您可以包含代码,以便我们能够准确地看到这是如何声明的吗?您可以在您的帖子中复制粘贴代码,选择它,然后按Ctrl+K。您的
+
看起来像是标准的ASCII加号,但您的
-
的unicode值为8722,而不是预期的45。请确保您使用的字符是预期的,因为有多个字符看起来像
-
的e字符。你不需要
initOperators
,你可以直接将操作符定义为映射文字。可能是一个愚蠢的注释,但这应该可以将字符串转换为数学表达式?如果是,那么我希望你知道NSExpression…但正如我所说的:这可能是一个愚蠢的注释。是的,你是嗯,我使用了不同的价值观。但我还是加入了debuger@JarosławKrajewski如果我做
打印(onp.knownOperators)
我会得到
[“×”:2,“+”:1,“/”:3,”−“:1]
。如何调用类并显示运算符?(请不要依赖调试器预览,有时它可能不会显示某些值)在这种情况下,我的程序可以工作,但我想知道为什么调试器说只有在键为“+”时才无法读取数据。
enum KnownOperator: String {
    case Plus = "+"        // U+2B
    case Minus = "−"       // U+2212
    case Multiply = "×"    // U+D7
    case Divide = "/"      // U+2F
}

let knownOperators: [KnownOperator: Int] = [.Plus: 1, .Minus: 1, .Multiply: 2, .Divide: 2]