如何扩展 String 的 UnsafePointer<Int8> 初始值设定项以接受 NULL 指针?

How to extend String's UnsafePointer<Int8> initializer to accept NULL pointers?

在 Swift 中,有一个字符串初始化器,它接受一个 UnsafePointer<Int8>(或者我认为是相同的 UnsafePointer<CChar>)作为参数。

但是,没有采用可选 UnsafePointer 的初始化程序,例如一个 NULL 的指针(或者 nil,说得很快),这在使用 C API.

时非常有用

我想扩展字符串 class 以接受可选的不安全指针。

这就是我的扩展程序的样子。那是对的吗?这是实现该功能的方式吗?

extension String {
    init?(cString: UnsafePointer<Int8>?) {
        guard let cString = cString else { return nil }
        self = String(cString: cString)
    }
}

没关系。如果给定的参数是 nil,你有一个可失败的初始化器,它“失败”(returns nil)。否则它解包参数并通过分配给 self 来初始化字符串(这可以用 struct 类型完成)。

CChar 在所有 Apple 平台上确实与 Int8 类型相同(其中 char 符号 字符)。我会将参数类型写成 UnsafePointer<CChar>? 以强调与 C 中 char 类型的联系。

一个(仅略有不同)替代方案是

extension String {
    init?(cString: UnsafePointer<CChar>?) {
        guard let cString = cString else { return nil }
        self.init(cString: cString)
    }
}

但这纯粹是品味问题。