Swift 5 中的 XOR?

XOR in Swift 5?

我正在尝试在 Swift 5 中执行 XOR 运算。文档似乎没有明确提及在此处使用两个布尔值执行此操作:

https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html

这可能吗?它说要使用 ^ 操作,但尝试时出现错误:

 card != nil ^ appointment.instructor == nil

ERROR Adjacent operators are in non-associative precedence group 'ComparisonPrecedence'

文档明确指出 ^ 按位异或 运算符并且由于 Bool 只是一个位,因此未定义按位异或它。如果您在表达式中加上正确的括号,您会收到正确的错误消息:

(card != nil) ^ (appointment.instructor == nil)

Binary operator '^' cannot be applied to two 'Bool' operands

Swift 中没有 XOR 运算符,因此要对两个 Bool 进行 XOR,您需要定义自己的 XOR 函数或运算符。

infix operator ^^
extension Bool {
    static func ^^(lhs:Bool, rhs:Bool) -> Bool {
        if (lhs && !rhs) || (!lhs && rhs) {
            return true
        }
        return false
    }
}

测试:

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

^ 运算符是为整数类型定义的,而不是为 Bool 定义的。您可以添加自己的定义,但这并不是绝对必要的。 Bool 上的异或运算与 != 运算相同。这是 A XOR BA != B 的真值表:

A B A^B A!=B
F F  F   F
F T  T   T
T F  T   T
T T  F   F

所以我们可以这样写你的表达式:

(card != nil) != (appointment.instructor == nil)

虽然这有点难以理解。如果目标是确保其中一种情况为真,为了清楚起见,我可能会这样写:

[(card != nil), (appointment.instructor == nil)].filter({ [=12=] == true }).count == 1

您需要为 Bool 定义 ^,因为它只存在于 Ints 中。请参阅苹果文档 here

示例:

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)