在 Swift 中使用 C - strlcpy - 无法转换 'UnsafeMutablePointer<_>' 类型的值
Using C in Swift - strlcpy - Cannot convert value of type 'UnsafeMutablePointer<_>'
我正在尝试在 Swift 3.0 中使用 strlcpy,但一直收到错误 "Cannot convert value of type 'UnsafeMutablePointer<_>' to expected argument type 'UnsafeMutablePointer!'"
这是我的代码
func login(portal: String, username: String, password: String) {
var loginEvent = VidyoClientInEventLogIn()
let portalCArray = UnsafeMutablePointer<Int8>(mutating: (portal as NSString).utf8String!)
withUnsafeMutablePointer(to: &loginEvent.portalUri) {
strlcpy([=12=], portalCArray, MemoryLayout.size(ofValue: [=12=]))
}
}
其中 VidyoClientInEventLogIn 是:
typedef struct VidyoClientInEventLogIn_
{
/*! Portal URI, i.e. "https://example.test.com" */
char portalUri[URI_LEN];
} VidyoClientInEventLogIn;
C 数组作为元组导入到 Swift。但是内存布局
C 结构保留在 Swift 中,因此您可以使用地址
第一个元组元素 loginEvent.portalUri.0
(类型为 CChar
又名 Int8
)
作为目标地址。
您也可以将 Swift String
作为参数直接传递给函数
采用 UnsafePointer<CChar>
参数,一个临时的 C 字符串
表示是自动创建的。
这将事情简化为:
func login(portal: String, username: String, password: String) {
var loginEvent = VidyoClientInEventLogIn()
strlcpy(&loginEvent.portalUri.0, portal, MemoryLayout.size(ofValue: loginEvent.portalUri))
}
我正在尝试在 Swift 3.0 中使用 strlcpy,但一直收到错误 "Cannot convert value of type 'UnsafeMutablePointer<_>' to expected argument type 'UnsafeMutablePointer!'"
这是我的代码
func login(portal: String, username: String, password: String) {
var loginEvent = VidyoClientInEventLogIn()
let portalCArray = UnsafeMutablePointer<Int8>(mutating: (portal as NSString).utf8String!)
withUnsafeMutablePointer(to: &loginEvent.portalUri) {
strlcpy([=12=], portalCArray, MemoryLayout.size(ofValue: [=12=]))
}
}
其中 VidyoClientInEventLogIn 是:
typedef struct VidyoClientInEventLogIn_
{
/*! Portal URI, i.e. "https://example.test.com" */
char portalUri[URI_LEN];
} VidyoClientInEventLogIn;
C 数组作为元组导入到 Swift。但是内存布局
C 结构保留在 Swift 中,因此您可以使用地址
第一个元组元素 loginEvent.portalUri.0
(类型为 CChar
又名 Int8
)
作为目标地址。
您也可以将 Swift String
作为参数直接传递给函数
采用 UnsafePointer<CChar>
参数,一个临时的 C 字符串
表示是自动创建的。
这将事情简化为:
func login(portal: String, username: String, password: String) {
var loginEvent = VidyoClientInEventLogIn()
strlcpy(&loginEvent.portalUri.0, portal, MemoryLayout.size(ofValue: loginEvent.portalUri))
}