我正在浏览 docs ,然后我找到了 StaticString
。它指出:
An simple string designed to represent text that is "knowable at compile-time".
我最初认为 String
与 NSString
具有相同的行为,这在编译时是已知的,但看起来我错了。所以我的问题是我们什么时候应该使用 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/