如何扩展String的UnsafePointer <Int8>初始化程序以接受NULL指针?

时间:2019-10-01 11:32:27

标签: swift string pointers unsafe-pointers

在Swift中,有一个String初始化程序,将UnsafePointer<Int8>(或我认为相同的UnsafePointer<CChar>)作为参数。

但是,没有初始化程序需要可选的UnsafePointer,例如NULL(或者为零,表示敏捷)的指针,在使用C API时非常有用。

我想扩展String类以接受可选的不安全指针。

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

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

1 个答案:

答案 0 :(得分:3)

很好。您有一个失败的初始化程序,如果给定的参数为nil,则它将“失败”(返回nil)。否则,它将解开参数并通过分配给self来初始化字符串(可以使用struct类型来完成)。

在所有Apple平台上,

CChar的类型确实与Int8相同(其中char signed 字符)。我会将参数类型写为UnsafePointer<CChar>?,以强调与C语言中的char类型的联系。

(只是稍有不同)替代方法是

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

但这纯粹是一个品味问题。