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 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({ [=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)
我正在尝试在 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 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({ [=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)