我正在尝试在Swift 5中执行XOR操作。文档似乎并未在此处明确提及使用两个布尔值来执行此操作:
https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html
这可能吗?它说要使用该^操作,但是尝试时出现错误:
card != nil ^ appointment.instructor == nil
Run Code Online (Sandbox Code Playgroud)
错误相邻运算符位于非关联优先级组“ ComparisonPrecedence”中
该^经营者为整数类型而不是定义Bool。您可以添加自己的定义,但并非必须如此。的XOR操作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
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)
您需要为其定义^,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)
文档明确指出这^是按位异或运算符,并且由于 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)
| 归档时间: |
|
| 查看次数: |
1778 次 |
| 最近记录: |