Двоичный оператор ' ~ = 'не может быть применен к операндам типа' String 'и' String?'

у меня есть простой оператор 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 ответов


из-за Дополнительные Цепочки, bubble?.name типа String?. У вас есть несколько вариантов:

  • использовать "largeBubble"? в своем case выражение (Только Swift 2+).
  • проверяем на ноль, прежде чем делать свой switch, поэтому аргумент switch будет String вместо String?.
  • использовать bubble!.name (или bubble.name если это SKPhysicsBody!) если абсолютно точно что это не будет ноль

как сказал @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-это целочисленный тип, который был преобразован в String by String (Int) function


в Swift 2.0 (отправитель: UIButton) тогда ! для работы строки коммутатора.

let operation = sender.currentTitle!

в Swift 2.0, (отправителя: какой-либо объект) тогда !! для работы строки коммутатора.

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
        }

    }