我需要测试返回一个可选的表达式是否为零。这似乎是一个没有脑子,但这里是代码。
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 }) { … }
我在这里遗漏了一些微妙的东西吗?我想如果nil!=可选…,如果让_ =可选…在这里是等效的。
更新以解决一些问题的答案
>我没有看到nil!= var和var!= nil之间的区别,尽管我通常使用var!= nil。在这种情况下,在块获得布尔比较的块与if的布尔比较后,推!!= nil。
>使用Wildcard Pattern不应该是令人惊讶或不寻常的。它们用于元组(x,_)=(10,20),1到5中的for-in循环,case语句(_,0):和更多(注:这些示例取自Swift编程语言)。
这个问题是关于两种形式的功能对等,而不是关于编码风格的选择。那个对话可以在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!") }
VS
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