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 …这里是等价的。


  1. 我不明白之间的差别nil != varvar != nil,虽然我一般使用var != nil。在这种情况下,!= nil在块之后推入将获得混合的块的布尔比较与if的布尔比较。

  2. 通配符模式的使用不应令人惊讶或罕见。它们用于元组(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 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

以上是 if nil!=可选…和让_ =可选…之间有什么区别? 的全部内容, 来源链接: utcz.com/qa/414242.html

回到顶部