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