在其他语言(如Java)中,通过字符串文字与初始化程序获得的字符串之间实际上存在区别。在Swift中,它们等同吗?
例如
var string:String = "" var string:String = String()
根据苹果文档,这些声明是等效的:
初始化一个空字符串 要创建一个空的String值作为构建更长的字符串的起点,请为一个变量分配一个空的字符串文字,或者使用初始化语法初始化一个新的String实例:
初始化一个空字符串
要创建一个空的String值作为构建更长的字符串的起点,请为一个变量分配一个空的字符串文字,或者使用初始化语法初始化一个新的String实例:
var emptyString = "" // empty string literal var anotherEmptyString = String() // initializer syntax // these two strings are both empty, and are equivalent to each other
参考:https : //developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html
如果看一下程序集,我们将看到两个构造函数使用相同的指令。
string.swift:
let str = String() let str2 = ""
编译的汇编(swiftc -emit-assembly string.swift):
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 _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_token4@GOTPCREL(%rip), %rax movq _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func4@GOTPCREL(%rip), %rcx xorl %edx, %edx movl %edi, -4(%rbp) movq %rax, %rdi movq %rsi, -16(%rbp) movq %rcx, %rsi callq _swift_once movq _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_token5@GOTPCREL(%rip), %rdi movq _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func5@GOTPCREL(%rip), %rax xorl %r8d, %r8d movl %r8d, %edx movq __TZvOSs7Process5_argcVSs5Int32@GOTPCREL(%rip), %rcx movl -4(%rbp), %r8d movl %r8d, (%rcx) movq %rax, %rsi callq _swift_once movq __TZvOSs7Process11_unsafeArgvGVSs20UnsafeMutablePointerGS0_VSs4Int8__@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
请注意,str和str2的声明具有相同的指令:
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
您可以通过阅读Apple文档来了解有关String文字的更多信息。