二元运算符“~=”无法应用于类型为“String”和“String?”的操作数

7

我有一个简单的switch语句,但实际上并不简单。

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

在这里,我遇到了标题中提到的错误:二元运算符“〜=”不能应用于类型为'String'和'String?'的操作数。而且我不知道为什么其中一个是可选项就会出现问题。

4个回答

8
因为 Optional Chainingbubble?.name 的类型是 String?。你有几个选择:
  • 在你的 case 表达式中使用 "largeBubble"?(仅适用于 Swift 2+)。
  • 在执行 switch 之前检查是否为 nil,这样 switch 参数将是一个 String 而不是 String?
  • 如果你绝对确定它不会为 nil,则使用 bubble!.name(或者如果它是一个 SKPhysicsBody!,则使用 bubble.name)。

选项 #4:switch(bubble?.name ?? "unknown") { ... } - Martin R
当然可以,但在某些情况下,您将会与字符串“unknown”进行不必要的比较 :) 当然,这可能非常快,所以并不重要... - jtbandes
bubble!.name 没有起作用 - 只有与 some() 结合使用才有效。认为这就是为什么总会有一个默认值...如果名称没有设置的话。 - Jurik
@Jurik,bubble是什么类型?(SKPhysicsBody还是SKPhysicsBody?或者是! - jtbandes
ﻭ؟ﻷﻧ»ﺥﻟ؛└SKPhysicsContactﻟ٨ﺝﻫﻸ▒bodyAﻧ┤≈bodyBﻛ°∙ - Jurik
bodyAbodyB均为SKPhysicsNode!。虽然我不是100%确定,但我怀疑它们永远不会为空,因此直接使用bubble.name是安全的解决方案。这是我推荐的解决方法。 - jtbandes

3
正如@jtbandes所说,问题在于的类型为String?。除了给出的解决方案之外,另一种解决方法是重写~=运算符,使其接受String?String作为参数,例如:
func ~= (lhs: String, rhs: String?) -> Bool {
    return lhs == rhs
}

或者,为了更加通用:
func ~= <T: Equatable>(lhs: T, rhs: T?) -> Bool {
    return lhs == rhs
}

Equatable 就足够了 :) - Martin R

1
“值永远不会被隐式转换为另一种类型。如果您需要将一个值转换为不同的类型,必须显式地创建所需类型的实例。”
“let label = "The width is "
let width = 94
let widthLabel = label + String(width)”

这里的width是一个整数类型,它已经通过String(Int)函数转换为字符串。


0
在Swift 2.0中(发送者:UIButton),然后使用!来切换字符串。
let operation = sender.currentTitle!

在Swift 2.0中,(sender: AnyObject)然后使用!!来进行字符串的switch操作。
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
        }

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接