Saltar al contenido

¿XOR en Swift 5?

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 Bools, 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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *