if nil!=可选…和让_ =可选…之间有什么区别?
我需要测试返回可选值的表达式是否为nil
。这似乎很容易,但是这里是代码。
if nil != self?.checklists.itemPassingTest({ $0 === note.object }) { …
}
由于某种原因,这令我不悦。
if let item = self?.checklists.itemPassingTest({ $0 === note.object }) { …
}
对我来说看起来好多了,但是我实际上不需要该物品,我只需要知道是否退货即可。因此,我使用了以下内容。
if let _ = self?.checklists.itemPassingTest({ $0 === note.object }) { …
}
我在这里想念些微妙的东西吗?我想if nil != optional …
和if let _ = optional …
这里是等价的。
我不明白之间的差别
nil != var
和var != nil
,虽然我一般使用var != nil
。在这种情况下,!= nil
在块之后推入将获得混合的块的布尔比较与if的布尔比较。通配符模式的使用不应令人惊讶或罕见。它们用于元组
(x, _) = (10, 20)
,for-in循环for _ in 1...5
,case语句case (_, 0):
等(注意:这些示例摘自The Swift Programming Language)。
这个问题是关于两种形式的功能等效性,而不是关于编码样式的选择。该对话可以在programmers.stackexchange.com上进行。
在所有这些时间之后,Swift 2.0引起了人们的关注
if self?.checklists.contains({ $0 === note.object }) ?? false { …
}
回答:
经过优化,这两种方法可能是相同的。
例如,在这种情况下,请使用编译以下内容swiftc -O -emit-assembly if_let.swift
:
import Darwin// using arc4random ensures -O doesn’t just
// ignore your if statement completely
let i: Int? = arc4random()%2 == 0 ? 2 : nil
if i != nil {
println("set!")
}
与
import Darwinlet i: Int? = arc4random()%2 == 0 ? 2 : nil
if let _ = i {
println("set!")
}
产生相同的汇编代码:
; call to arc4random callq _arc4random
; check if LSB == 1
testb $1, %al
; if it is, skip the println
je LBB0_1
movq $0, __Tv6if_let1iGSqSi_(%rip)
movb $1, __Tv6if_let1iGSqSi_+8(%rip)
jmp LBB0_3
LBB0_1:
movq $2, __Tv6if_let1iGSqSi_(%rip)
movb $0, __Tv6if_let1iGSqSi_+8(%rip)
leaq L___unnamed_1(%rip), %rax ; address of "set!" literal
movq %rax, -40(%rbp)
movq $4, -32(%rbp)
movq $0, -24(%rbp)
movq __TMdSS@GOTPCREL(%rip), %rsi
addq $8, %rsi
leaq -40(%rbp), %rdi
; call println
callq __TFSs7printlnU__FQ_T_
LBB0_3:
xorl %eax, %eax
addq $32, %rsp
popq %rbx
popq %r14
popq %rbp
retq
以上是 if nil!=可选…和让_ =可选…之间有什么区别? 的全部内容, 来源链接: utcz.com/qa/414242.html