如何在运行时将StaticString转换为String?

Dav*_*tti 7 string literals swift

在斯威夫特3,是下面的转换来创建一个正确的方式StringStaticString

let fileName : StaticString = #file
let currentFile : String = file.description
Run Code Online (Sandbox Code Playgroud)

Ham*_*ish 12

不,严格来说,这不是将a转换StaticString为a 的正确方法String。返回的值description是实现细节。

获得a的最简单方法String是不添加显式类型注释fileName。因为它将默认为String

let fileName = #file
print(type(of: fileName)) // String
Run Code Online (Sandbox Code Playgroud)

但是,假设在您的实际用例中这是不可能的,另一个选择是将StaticStringwithUTF8Buffer(_:)方法与Stringinit(decoding:as:)Initializer 一起使用,以便对静态字符串的UTF-8代码单元进行解码:

let fileName: StaticString = #file

let currentFile = fileName.withUTF8Buffer {
    String(decoding: $0, as: UTF8.self)
}

print(currentFile)
Run Code Online (Sandbox Code Playgroud)

而且,当然,您可以为此创建自己的便捷初始化程序:

extension String {

    init(_ staticString: StaticString) {
        self = staticString.withUTF8Buffer {
            String(decoding: $0, as: UTF8.self)
        }
    }
}

let fileName: StaticString = #file
let currentFile = String(fileName)

print(currentFile)
Run Code Online (Sandbox Code Playgroud)

但是,这种转换确实不应该经常出现。

  • `withUTF8Buffer` 是否保证提供以 NUL 结尾的缓冲区?我在文档或实施中找不到任何保证的证据。 (2认同)

Hix*_*eld 5

这应该有效:

let fileName : StaticString = #file
let currentFile : String = "\(fileName)"
Run Code Online (Sandbox Code Playgroud)

(斯威夫特 4)

  • 请注意,字符串插值最终将调用 `description` 属性,因此这也取决于实现细节。 (4认同)