'UnsafePointer<Int8>' 不可转换为 'UnsafePointer<_>
'UnsafePointer<Int8>' is not convertible to 'UnsafePointer<_>
我正在尝试使用 Swift 实现围绕 libssh2 编写包装器。以下代码用于通过 SFTP 删除文件。
func removeFile(_ path: String) {
let data = path.data(using: String.Encoding.utf8)!
let result = data.withUnsafeBytes { (pointer: UnsafePointer<Int8>) -> Int in
return libssh2_sftp_unlink_ex(sftpHandle, pointer, data.count)
}
}
对于 pointer: UnsafePointer<Int8>
我收到以下错误消息:
'UnsafePointer<Int8>' is not convertible to 'UnsafePointer<_>
我找到了 this 个关于 UInt8
的类似问题的帖子。我尝试删除演员表,但只是收到下一个错误:
'Swift.UnsafePointer<_>' is not convertible to 'Swift.UnsafePointer<_>'
运行 闭包外的 libssh2_sftp_unlink_ex(sftpHandle, pointer, data.count)
可以使用虚拟指针。
我还找到了 this 关于将字符串转换为 UInt8
的答案,问题是我无法将其移植到 Int8
。关于如何正确转换指针有什么想法吗?
data.withUnsafeBytes
用 UnsafeRawBufferPointer
调用闭包,这必须“绑定”到 UnsafePointer<Int8>
。此外 data.count
必须转换为 UInt32
(又名 CUnsignedInt
),因为这就是 C 类型 unsigned integer
导入到 Swift:
的方式
func removeFile(_ path: String) {
let data = path.data(using: String.Encoding.utf8)!
let result = data.withUnsafeBytes {
libssh2_sftp_unlink_ex(sftpHandle,
[=10=].bindMemory(to: Int8.self).baseAddress,
UInt32(data.count))
}
}
或者,使用 String
的 withCString()
方法:
func removeFile(_ path: String) {
let result = path.withCString {
libssh2_sftp_unlink_ex(sftpHandle, [=11=], UInt32(strlen([=11=])))
}
}
更简单:使用只需要 C 字符串而不是显式字符串长度的变体。这里编译器自动创建代码将 Swift 字符串转换为临时 C 字符串:
func removeFile(_ path: String) {
let result = libssh2_sftp_unlink(sftpHandle, path)
}
(不起作用,因为 libssh2_sftp_unlink
是一个 宏 并且没有导入到 Swift。)
我正在尝试使用 Swift 实现围绕 libssh2 编写包装器。以下代码用于通过 SFTP 删除文件。
func removeFile(_ path: String) {
let data = path.data(using: String.Encoding.utf8)!
let result = data.withUnsafeBytes { (pointer: UnsafePointer<Int8>) -> Int in
return libssh2_sftp_unlink_ex(sftpHandle, pointer, data.count)
}
}
对于 pointer: UnsafePointer<Int8>
我收到以下错误消息:
'UnsafePointer<Int8>' is not convertible to 'UnsafePointer<_>
我找到了 this 个关于 UInt8
的类似问题的帖子。我尝试删除演员表,但只是收到下一个错误:
'Swift.UnsafePointer<_>' is not convertible to 'Swift.UnsafePointer<_>'
运行 闭包外的 libssh2_sftp_unlink_ex(sftpHandle, pointer, data.count)
可以使用虚拟指针。
我还找到了 this 关于将字符串转换为 UInt8
的答案,问题是我无法将其移植到 Int8
。关于如何正确转换指针有什么想法吗?
data.withUnsafeBytes
用 UnsafeRawBufferPointer
调用闭包,这必须“绑定”到 UnsafePointer<Int8>
。此外 data.count
必须转换为 UInt32
(又名 CUnsignedInt
),因为这就是 C 类型 unsigned integer
导入到 Swift:
func removeFile(_ path: String) {
let data = path.data(using: String.Encoding.utf8)!
let result = data.withUnsafeBytes {
libssh2_sftp_unlink_ex(sftpHandle,
[=10=].bindMemory(to: Int8.self).baseAddress,
UInt32(data.count))
}
}
或者,使用 String
的 withCString()
方法:
func removeFile(_ path: String) {
let result = path.withCString {
libssh2_sftp_unlink_ex(sftpHandle, [=11=], UInt32(strlen([=11=])))
}
}
更简单:使用只需要 C 字符串而不是显式字符串长度的变体。这里编译器自动创建代码将 Swift 字符串转换为临时 C 字符串:
func removeFile(_ path: String) {
let result = libssh2_sftp_unlink(sftpHandle, path)
}
(不起作用,因为 libssh2_sftp_unlink
是一个 宏 并且没有导入到 Swift。)