Solución:
Necesitas definir ^
por Bool
ya que solo existe para Ints. Consulte la documentación de Apple aquí.
Ejemplo:
import UIKit
import PlaygroundSupport
extension Bool {
static func ^ (left: Bool, right: Bool) -> Bool {
return left != right
}
}
let a = true
let b = false
print (a^b)
los ^
El operador está definido para tipos enteros pero no para Bool
. Puede agregar su propia definición, pero no es estrictamente necesario. La operación XOR en Bool
es lo mismo que el !=
operación. Aquí están las tablas de verdad para A XOR B
y A != B
:
A B A^B A!=B
F F F F
F T T T
T F T T
T T F F
Entonces podríamos escribir tu expresión así:
(card != nil) != (appointment.instructor == nil)
Sin embargo, eso es algo difícil de entender. Si el objetivo es asegurar que exactamente uno de los casos sea cierto, podría escribirlo así para mayor claridad:
[(card != nil), (appointment.instructor == nil)].filter({ $0 == true }).count == 1
La documentación establece claramente que ^
es el XOR bit a bit operador y desde un Bool
es solo un bit, el XOR bit a bit no está definido en él. Si coloca los paréntesis correctos en su expresión, obtendrá el mensaje de error correcto:
(card != nil) ^ (appointment.instructor == nil)
El operador binario ‘^’ no se puede aplicar a dos operandos ‘Bool’
No hay un operador XOR en Swift, así que para hacer un XOR en dos Bool
s, debe definir su propia función u operador XOR.
infix operator ^^
extension Bool {
static func ^^(lhs:Bool, rhs:Bool) -> Bool {
if (lhs && !rhs) || (!lhs && rhs) {
return true
}
return false
}
}
Pruebas:
let trueValue:Bool? = true
let falseValue:Bool? = false
let nilValue:Bool? = nil
(trueValue != nil) ^^ (nilValue != nil) // true
(trueValue != nil) ^^ (falseValue != nil) // false
(nilValue != nil) ^^ (nilValue != nil) // false