Swift 5 中的异或?

Posted

技术标签:

【中文标题】Swift 5 中的异或?【英文标题】:XOR in Swift 5? 【发布时间】:2019-08-23 23:40:05 【问题描述】:

我正在尝试在 Swift 5 中进行 XOR 操作。文档似乎没有在这里明确提到使用两个布尔值进行操作:

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

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

 card != nil ^ appointment.instructor == nil

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

【问题讨论】:

^ 不能应用于Bool。请改用!=。你对上面的声明做了什么?加入一些() 以保持理智。您似乎没有将其分配给变量或对其进行测试。 比较 ***.com/questions/29555569/…:在 Swift 1.2 中不推荐使用 Bool 的 XOR 运算符。 【参考方案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)

【讨论】:

【参考方案2】:

^ 运算符是为整数类型定义的,但不是为 Bool 定义的。您可以添加自己的定义,但并非绝对需要。 Bool 上的 XOR 操作与 != 操作相同。这是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( $0 == true ).count == 1

【讨论】:

【参考方案3】:

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

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

二元运算符 '^' 不能应用于两个 'Bool' 操作数

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
    

测试:

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

【讨论】:

以上是关于Swift 5 中的异或?的主要内容,如果未能解决你的问题,请参考以下文章

汇编代码 - 循环中的异或如何工作? [复制]

1863. 找出所有子集 的异或总和 再求和回溯

正则表达式中的异或

SQL注入学习总结:其他SQL注入的异或注入

二进制和位运算中的异或

位运算中的异或运算