Swift 5中的XOR?

Zac*_*ack 3 xor swift swift5

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

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

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

 card != nil ^ appointment.instructor == nil
Run Code Online (Sandbox Code Playgroud)

错误相邻运算符位于非关联优先级组“ ComparisonPrecedence”中

rob*_*off 6

^经营者为整数类型而不是定义Bool。您可以添加自己的定义,但并非必须如此。的XOR操作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
Run Code Online (Sandbox Code Playgroud)

因此,我们可以这样编写您的表达式:

(card != nil) != (appointment.instructor == nil)
Run Code Online (Sandbox Code Playgroud)

不过,这有点难以理解。如果目标是确保其中一种情况正确,那么为清楚起见,我可以这样写:

[(card != nil), (appointment.instructor == nil)].filter({ $0 == true }).count == 1
Run Code Online (Sandbox Code Playgroud)


Jos*_*ann 6

您需要为其定义^Bool因为它仅适用于Ints。请参阅此处的Apple文档。

例:

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)
Run Code Online (Sandbox Code Playgroud)


Dáv*_*tor 5

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

(card != nil) ^ (appointment.instructor == nil)
Run Code Online (Sandbox Code Playgroud)

二元运算符“^”不能应用于两个“布尔”操作数

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

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

测试:

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
Run Code Online (Sandbox Code Playgroud)