我需要测试返回可选值的表达式是否为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 …这里是等价的。
if nil != optional …
if let _ = optional …
更新以解决答案中的一些问题
我不明白之间的差别nil != var和var != nil,虽然我一般使用var != nil。在这种情况下,!= nil在块之后推入将获得混合的块的布尔比较与if的布尔比较。
nil != var
var != nil
!= nil
通配符模式的使用不应令人惊讶或罕见。它们用于元组(x, _) = (10, 20),for-in循环for _ in 1...5,case语句case (_, 0):等(注意:这些示例摘自The Swift Programming Language)。
(x, _) = (10, 20)
for _ in 1...5
case (_, 0):
这个问题是关于两种形式的功能等效性,而不是关于编码样式的选择。该对话可以在programmers.stackexchange.com上进行。
在所有这些时间之后,Swift 2.0引起了人们的关注
if self?.checklists.contains({ $0 === note.object }) ?? false { … }
经过优化,这两种方法可能是相同的。
例如,在这种情况下,请使用编译以下内容swiftc -O -emit-assembly if_let.swift:
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 Darwin let 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