gpt4 book ai didi

swift - if nil != optional ... 和 if let _ = optional ... 之间有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 05:13:55 26 4
gpt4 key购买 nike

我需要测试返回可选值的表达式是否为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。在这种情况下,在 block 获得与 if 的 bool 比较混合的 block 的 bool 比较之后推送 != nil

  2. Wildcard Pattern的使用不应该那么令人惊讶或不寻常。它们用于元组 (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

关于swift - if nil != optional ... 和 if let _ = optional ... 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29322977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com