'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.withUnsafeBytesUnsafeRawBufferPointer 调用闭包,这必须“绑定”到 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))
    }
}

或者,使用 StringwithCString() 方法:

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。)