在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)
}
}
答案 0 :(得分:3)
很好。您有一个失败的初始化程序,如果给定的参数为nil
,则它将“失败”(返回nil
)。否则,它将解开参数并通过分配给self
来初始化字符串(可以使用struct
类型来完成)。
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)
}
}
但这纯粹是一个品味问题。