swift – 如果nil!=可选…和if _ _可选…之间有什么区别?
我需要测试返回一个可选的表达式是否为零。这似乎是一个没有脑子,但这里是代码。
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。 这个问题是关于两种形式的功能对等,而不是关于编码风格的选择。那个对话可以在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |