当前位置: 首页 > 面试题库 >

if nil!=可选…和让_ =可选…之间有什么区别?

刘和正
2023-03-14
问题内容

我需要测试返回可选值的表达式是否为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


 类似资料:
  • 这两种方法有什么区别:和? 请举个例子。

  • 最后,本文介绍了新的Java 8<code>Optional<code>,指出: Optional远不如Scala中的Option[T]强大(但至少它不允许包装null)。该API不像空处理那样简单,而且可能要慢得多。但是编译时检查的好处加上可读性和可选使用的文档价值大大超过了缺点 我对Scala有着非常基本的了解,而且我对Java 8<code>Optional<code>也越来越熟悉,所以乍一

  • 如果像Apple在Swift编程中所说的隐式展开选项应该总是有一个值,那么为什么不使用非选项来代替呢?我知道非选项不能赋值为nil,但还有其他区别吗?

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 我尝试了几种向表添加滚动的方法,但是只有其中一种可以正常工作。它们之间有什么区别? 第一: 第二: 第三: 第四: 问题答案: Element.scrollIntoView() 方法将调用该元素的元素滚动到浏览器窗口的视口中。 句法: //布尔参数 //对象参数 您的用例: :这行代码会将元素滚动到浏览器窗口的可见区域。 :此代码行将滚动元素以使其与可滚动祖先的视口顶部对齐。此选项对应

  • 我正在寻找编译过程中使用的默认编译器标志。因此,我使用了命令