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 B
和A != 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 运算符,因此要对两个 Bool
s 进行 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 中的异或?的主要内容,如果未能解决你的问题,请参考以下文章