2015-07-03 14 views
7

In altri linguaggi come Java, sotto il cofano c'è effettivamente una differenza tra string ottenuta tramite string letterale vs inizializzatore. In Swift, sono equivalenti sotto il cofano?Stringa rapida tramite stringa letterale vs inizializzatore

ad es.

var string:String = "" 
var string:String = String() 

si riferiscono a questo SO post per informazioni sulle differenze tra letterale e oggetti in Java.

+0

sono tutti uguali. "" –

+1

'String' è una struttura in Swift, non un tipo di riferimento come Java. Finora non ho trovato un caso in cui faccia la differenza. –

risposta

7

Le dichiarazioni sono equivalenti secondo la documentazione Apple:

Inizializzazione una stringa vuota

Per creare un valore di stringa vuota come punto di partenza per la costruzione di una stringa più lunga, o assegnare una stringa vuota letterale a una variabile, o inizializzare una nuova istanza stringa con la sintassi inizializzatore:

var emptyString = ""    // empty string literal 
var anotherEmptyString = String() // initializer syntax 
// these two strings are both empty, and are equivalent to each other 

Riferimento: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html

Se guardiamo all'assemblaggio, vedremo che i due costruttori usano istruzioni identiche.

string.swift:

let str = String() 
let str2 = "" 

assembly compilato (swiftc -emit-assembly string.swift):

.section __TEXT,__text,regular,pure_instructions 
    .macosx_version_min 14, 3 
    .globl _main 
    .align 4, 0x90 
_main: 
    .cfi_startproc 
    pushq %rbp 
Ltmp0: 
    .cfi_def_cfa_offset 16 
Ltmp1: 
    .cfi_offset %rbp, -16 
    movq %rsp, %rbp 
Ltmp2: 
    .cfi_def_cfa_register %rbp 
    subq $16, %rsp 
    movq [email protected](%rip), %rax 
    movq [email protected](%rip), %rcx 
    xorl %edx, %edx 
    movl %edi, -4(%rbp) 
    movq %rax, %rdi 
    movq %rsi, -16(%rbp) 
    movq %rcx, %rsi 
    callq _swift_once 
    movq [email protected](%rip), %rdi 
    movq [email protected](%rip), %rax 
    xorl %r8d, %r8d 
    movl %r8d, %edx 
    movq [email protected](%rip), %rcx 
    movl -4(%rbp), %r8d 
    movl %r8d, (%rcx) 
    movq %rax, %rsi 
    callq _swift_once 
    movq __TZvO[email protected]GOTPCREL(%rip), %rax 
    movq -16(%rbp), %rcx 
    movq %rcx, (%rax) 
    callq __TFSSCfMSSFT_SS 
    leaq L___unnamed_1(%rip), %rdi 
    xorl %r8d, %r8d 
    movl %r8d, %esi 
    movl $1, %r8d 
    movq %rax, __Tv6string3strSS(%rip) 
    movq %rdx, __Tv6string3strSS+8(%rip) 
    movq %rcx, __Tv6string3strSS+16(%rip) 
    movl %r8d, %edx 
    callq __TFSSCfMSSFT21_builtinStringLiteralBp8byteSizeBw7isASCIIBi1__SS 
    xorl %r8d, %r8d 
    movq %rax, __Tv6string4str2SS(%rip) 
    movq %rdx, __Tv6string4str2SS+8(%rip) 
    movq %rcx, __Tv6string4str2SS+16(%rip) 
    movl %r8d, %eax 
    addq $16, %rsp 
    popq %rbp 
    retq 
    .cfi_endproc 

    .globl __Tv6string3strSS 
.zerofill __DATA,__common,__Tv6string3strSS,24,3 
    .globl __Tv6string4str2SS 
.zerofill __DATA,__common,__Tv6string4str2SS,24,3 
    .section __TEXT,__cstring,cstring_literals 
L___unnamed_1: 
    .space 1 

    .no_dead_strip __Tv6string3strSS 
    .no_dead_strip __Tv6string4str2SS 
    .linker_option "-lswiftCore" 
    .section __DATA,__objc_imageinfo,regular,no_dead_strip 
L_OBJC_IMAGE_INFO: 
    .long 0 
    .long 512 


.subsections_via_symbols 

Si noti che le dichiarazioni per str e str2 hanno istruzioni identiche:

xorl %r8d, %r8d 
movl %r8d, %esi 
movl $1, %r8d 
movq %rax, __Tv6string3strSS(%rip) 
movq %rdx, __Tv6string3strSS+8(%rip) 
movq %rcx, __Tv6string3strSS+16(%rip) 
movl %r8d, %edx 

# ... 

xorl %r8d, %r8d 
movq %rax, __Tv6string4str2SS(%rip) 
movq %rdx, __Tv6string4str2SS+8(%rip) 
movq %rcx, __Tv6string4str2SS+16(%rip) 
movl %r8d, %eax 

Si può imparare ulteriori informazioni sui letterali String rivedendo lo Apple's documentation.

+0

Anche il mio codice di esempio è di Apple doc. Mentre è equivalente dal punto di vista dell'utilizzo, il documento non dice se è equivalente dietro la scena che è comune poiché la maggior parte delle guide linguistiche non arriva a quel livello. – Boon

+1

Al momento non sono nella mia macchina di compilazione ma se si compila un file swift con le due dichiarazioni usando il flag '-emit-assembly', verrà mostrato che le dichiarazioni sono identiche. – JAL

+0

@Boon E 'davvero la stessa cosa, non ci sarebbe modo per queste due espressioni di essere diverse, valutano la stessa cosa, non ci può essere nemmeno una differenza "sotto il cofano", a causa di come è fatta la libreria standard. Se riesci a trovare una differenza tra queste espressioni, allora hai fatto un errore, perché due espressioni con una valutazione identica non possono essere diverse – Kametrixom