Swift中的守卫对if给出不同的回答

Swift中的守卫对if给出不同的回答,swift,Swift,在一个比较两个链表的非常简单的程序中,我有一个递归函数,可以测试两个链表的当前节点是否相同,然后移动到下一个节点 基本情况是,如果两个节点为零,则退出 因此,带有if/else的代码 是: 有警卫 func compareLL(llistOne: SinglyLinkedListNode?, llistTwo: SinglyLinkedListNode?) -> Bool { guard (llistOne != nil && llistTwo != nil) el

在一个比较两个链表的非常简单的程序中,我有一个递归函数,可以测试两个链表的当前节点是否相同,然后移动到下一个节点

基本情况是,如果两个节点为零,则退出

因此,带有if/else的代码

是:

有警卫

func compareLL(llistOne: SinglyLinkedListNode?, llistTwo: SinglyLinkedListNode?) -> Bool {
    guard (llistOne != nil && llistTwo != nil) else {return true}
    if (llistOne?.data == llistTwo?.data) {return compareLL(llistOne: llistOne?.next, llistTwo: llistTwo?.next)}
    return false
}
那么为什么它们会产生不同的结果呢

也就是说,比较两个不同的链表(不同的长度)——因此根据guard语句,当
llistOne=5
list 2=nil
时,我们返回true(这不适用于if-then-else语句)。这是出乎意料的,因为我认为他们应该得到同样的结果


如何开发一个保护语句来生成与if模式相同的保护语句?

llistOne==nil&&llistTwo==nil的否定是
llistOne!=零| | llistTwo!=无

您的
if
仅在两个值均为零时返回。但是如果其中一个或两个值都为零,则您的
保护当前将返回。那不一样

因此,将您的
防护装置更改为:

guard (llistOne != nil || llistTwo != nil) else {return true}
你不妨仔细阅读一下

布尔逻辑的德摩根定律的基本总结如下:

not(a and b) === not(a) or not(b)
not(a or b) === not(a) and not(b)
在您的例子中,
a
llistOne==nil
,而
b
llistTwo==nil

您有
a和b
llistOne==nil&&llistTwo==nil
)。所以
not(a和b)
not(a)或not(b)
llistOne!=nil | | llistTwo!=nil

not(a and b) === not(a) or not(b)
not(a or b) === not(a) and not(b)