二进制运算符'〜='不能应用于'String'和'String?'类型的操作数

时间:2015-05-30 18:09:39

标签: swift switch-statement skphysicsbody

我有一个简单的switch语句并不那么简单。

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?'中提到错误。我不知道为什么其中一个是可选的问题。

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

正如@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
}

答案 2 :(得分:1)

“值永远不会隐式转换为其他类型。如果需要将值转换为其他类型,请显式创建所需类型的实例。“

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

这里width是一个Integer类型,它已被String(Int)函数

转换为String

答案 3 :(得分:0)

然后在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
        }

    }