如何扩展 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)
}
}
但这纯粹是品味问题。
在 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)
}
}
但这纯粹是品味问题。