加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 如果nil!=可选…和if _ _可选…之间有什么区别?

发布时间:2020-12-14 05:51:18 所属栏目:百科 来源:网络整理
导读:我需要测试返回一个可选的表达式是否为零。这似乎是一个没有脑子,但这里是代码。 if nil != self?.checklists.itemPassingTest({ $0 === note.object }) { …} 由于某种原因,我的眼睛看起来不愉快。 if let item = self?.checklists.itemPassingTest({ $0
我需要测试返回一个可选的表达式是否为零。这似乎是一个没有脑子,但这里是代码。
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读