Двоичный оператор ' ~ = 'не может быть применен к операндам типа' 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
}
}