二元运算符“~=”不能应用于 'String' 和 'String?' 类型的操作数

Binary operator '~=' cannot be applied to operands of type 'String' and 'String?'

我有一个简单的switch-statement其实没那么简单

switch(bubble?.name){ //bubble is SKPhysicsBody
    case "largeBubble": // <= error
        newBubbleSize = "medium"
        break;
    default:
        newBubbleSize = "large"
        break;
}

这里我得到了我在标题 Binary operator '~=' cannot be applied to operands of type 'String' and 'String?' 中提到的错误。我不知道为什么其中一个是可选的是个问题。

由于 Optional Chainingbubble?.name 的类型为 String?。您有几个选择:

  • case 表达式中使用 "largeBubble"?(仅限 Swift 2+)。
  • 在执行 switch 之前检查 nil,因此 switch 参数将是 String 而不是 String?
  • 如果您绝对确定[=32,请使用bubble!.name(或bubble.name,如果它是SKPhysicsBody!) =] 它不会是 nil

正如@jtbandes 所说,问题是 bubble?.name 具有类型 String? 的结果。对于给定的解决方案,另一种解决方案是覆盖 ~= 运算符以将 String?String 作为参数,例如:

func ~= (lhs: String, rhs: String?) -> Bool {
    return lhs == rhs
}

或者,使其更通用:

func ~= <T: Equatable>(lhs: T, rhs: T?) -> Bool {
    return lhs == rhs
}

“值永远不会隐式转换为另一种类型。如果您需要将值转换为不同的类型,请显式创建所需类型的实例。”

“let label = "The width is "
let width = 94
let widthLabel = label + String(width)”

这里的width是一个Integer类型,它被String(Int)函数转换成了String

在Swift 2.0(发件人:UIButton)然后!对于开关字符串有效。

let operation = sender.currentTitle!

在 Swift 2.0 中,(发件人:AnyObject)然后 !!开关字符串有效。

let operation = sender.currentTitle!!

我犯的错误是使用 AnyObject 而不是 UIButton。

@IBAction func operate(sender: AnyObject) {
        let operation = sender.currentTitle!!

        if userIsInTheMiddleOfTypeingNumber{
            enter()
        }

        switch operation{
            case "×":
                if operandStack.count >= 2{
                    displayValue = operandStack.removeLast() * operandStack.removeLast()
                }

                break
//            case "÷":
//                break
//            case "+":
//                break
//            case "−":
//                break
           default:
                break
        }

    }