String 通过字符串文字与初始值设定项的Swift字符串

String 通过字符串文字与初始值设定项的Swift字符串,string,swift,string-literals,String,Swift,String Literals,在Java等其他语言中,实际上通过字符串文字和初始值设定项获得的字符串之间存在差异。在Swift中,它们在引擎盖下是否等效 e、 g 有关Java中文字和对象之间差异的信息,请参阅此文档。根据Apple文档,声明是等效的: 初始化空字符串 要创建空字符串值作为构建较长字符串的起点,请为变量指定空字符串文字,或使用初始值设定项语法初始化新字符串实例: 参考: 如果我们查看程序集,我们将看到这两个构造函数使用相同的指令 string.swift: let str = String() let str

在Java等其他语言中,实际上通过字符串文字和初始值设定项获得的字符串之间存在差异。在Swift中,它们在引擎盖下是否等效

e、 g


有关Java中文字和对象之间差异的信息,请参阅此文档。

根据Apple文档,声明是等效的:

初始化空字符串

要创建空字符串值作为构建较长字符串的起点,请为变量指定空字符串文字,或使用初始值设定项语法初始化新字符串实例:

参考:

如果我们查看程序集,我们将看到这两个构造函数使用相同的指令

string.swift:

let str = String()
let str2 = ""
已编译程序集(
swiftc-emit assembly string.swift
):

请注意,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

您可以通过查看。

了解有关字符串文字的更多信息。它们都是相同的。“”
String
是Swift中的结构,而不是像Java那样的引用类型。到目前为止,我还没有发现任何一种情况会有不同。我的示例代码也来自Apple doc。虽然从使用角度来看它是等效的,但文档没有说明它在幕后是否等效,这是常见的,因为大多数语言指南都没有达到这一级别。我现在不在构建机器上,但如果您使用
-emit assembly
标志编译包含两个声明的swift文件,它会告诉你声明是一样的。@Boon我知道,这就是为什么我们要谈论Swift。在Swift(而不是Java)中,这些表达式的计算结果是相同的。日本航空公司也通过查看编译后的程序集证明了这一点code@Boon每次你创建一个字符串,比如
string()
string(””
),不管你创建了多少次,重要的是里面有什么:所有这些字符串里面什么都没有,因此,根据定义,它们在本质上是相关的。。。即使在Objective-C中,
NSString
是一种引用类型,literal与构造函数之间的区别也常常是相同的。
let str = String()
let str2 = ""
    .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
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