It appears that StaticString can hold string literals. You can’t assign a variable of type String to it, and it can’t be mutated (with +=, for example).
“Knowable at compile time” doesn’t mean that the value held by the variable will be determined at compile time, just that any value assigned to it is known at compile time.
Consider this example which does work:
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)
}
Any time you can give Swift more information about how a variable is to be used, it can optimize the code using it. By restricting a variable to StaticString, Swift knows the variable won’t be mutated so it might be able to store it more efficiently, or access the individual characters more efficiently.
In fact, StaticString could be implemented with just an address pointer and a length. The address it points to is just the place in the static code where the string is defined. A StaticString doesn’t need to be reference counted since it doesn’t (need to) exist in the heap. It is neither allocated nor deallocated, so no reference count is needed.
“Knowable at compile time” is pretty strict. Even this doesn’t work:
let str: StaticString = "hello " + "world"
which fails with error:
error: ‘String’ is not convertible to ‘StaticString’