string - 字符串和静态字符串的区别

标签 string swift

我正在浏览 docs ,然后我找到了 StaticString。它指出:

An simple string designed to represent text that is "knowable at compile-time".

我最初认为 StringNSString 具有相同的行为,这在编译时是已知的,但看起来我错了。所以我的问题是我们什么时候应该使用 StaticString 而不是 String,唯一的区别是 StaticString 在编译时是已知的吗?

我发现的一件事是

var a: String = "asdf" //"asdf"
var b: StaticString = "adsf" //{(Opaque Value), (Opaque Value), (Opaque Value)}

sizeofValue(a)  //24
sizeofValue(b)  //17

所以看起来 StaticString 的内存占用少了一点。

最佳答案

StaticString 似乎可以保存字符串文字。您不能将 String 类型的变量分配给它,也不能改变它(例如,使用 +=)。

“在编译时可知” 并不意味着变量持有的值将在编译时确定,只是指分配给它的任何值在编译时都是已知的。

考虑这个确实有效的例子:

var str: StaticString

for _ in 1...10 {
    switch arc4random_uniform(3) {
    case 0: str = "zero"
    case 1: str = "one"
    case 2: str = "two"
    default: str = "default"
    }
    print(str)
}

只要您可以向 Swift 提供有关如何使用变量的更多信息,它就可以优化使用它的代码。通过将变量限制为 StaticString,Swift 知道该变量不会发生变化,因此它可以更有效地存储它,或者更有效地访问各个字符。

事实上,StaticString 可以只用一个地址指针和一个长度来实现。它指向的地址就是静态代码中定义字符串的地方。 StaticString 不需要被引用计数,因为它不(需要)存在于堆中。它既没有分配也没有释放,所以不需要引用计数。

“在编译时可知” 非常严格。即使这样也行不通:

let str: StaticString = "hello " + "world"

因错误而失败:

error: 'String' is not convertible to 'StaticString'

关于string - 字符串和静态字符串的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247387/

相关文章:

c - 如何让字符串接收 int 值?这与转换无关

java - 如何从一串数字之间没有空格的数字中找到缺失的数字?

c - 在文件中查找单词?

swift - 我如何使用错误函数 - erf 和 Swift 语言

ios - 在 Swift 3/4 中单击按钮时视频无法打开?

C++ 测试字符串的最后一个字符

java - 在Java中,对于字符串x,s.length()的运行时成本是多少?是 O(1) 还是 O(n)?

swift - 泛型函数参数的多重约束

ios - 我可以在 static-cell-UITableView 中动态添加单元格吗?

swift - 在 Swift 中查找 View 内标签的 X 值位置