经过优化,这两种方法可能是相同的。
例如,在这种情况下,请使用编译以下内容
swiftc -O -emit-assembly if_let.swift:
import Darwin// using arc4random ensures -O doesn’t just// ignore your if statement completelylet i: Int? = arc4random()%2 == 0 ? 2 : nilif i != nil { println("set!")}与
import Darwinlet i: Int? = arc4random()%2 == 0 ? 2 : nilif 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_3LBB0_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



