将UnsafeMutablePointer值分配给UnsafePointer而不使用unsafeBitCast

时间:2017-06-21 12:49:31

标签: swift pointers swift3 casting unsafe-pointers

我正在使用一个C API来定义一个带有const char *的结构和一个返回char *的函数,并且我正在尝试找到执行赋值的最佳方法。

有没有办法在不使用unsafeBitCast的情况下执行此操作?如果我没有投下演员,那么我会收到这个错误:

Cannot assign value of type 'UnsafeMutablePointer<pchar>' 
(aka 'UnsafeMutablePointer<UInt8>') 
to type 'UnsafePointer<pchar>!' 
(aka 'ImplicitlyUnwrappedOptional<UnsafePointer<UInt8>>')

此外,使用pair()在下面初始化pairPtr是否会在堆栈上分配一对结构来初始化堆上的已分配对,因为对于结构必须为零的情况,这似乎效率低。 / p>

以下是示例代码:

C库标题(最小化以演示问题):

#ifndef __PAIR_INCLUDE__
#define __PAIR_INCLUDE__

typedef unsigned char pchar;

pchar*
pstrdup(const pchar* str);

typedef struct _pair {
    const pchar* left;
    const pchar* right;
} pair;

#endif // __PAIR_INCLUDE__

我的Swift代码:

import pair

let leftVal = pstrdup("left")
let rightVal = pstrdup("right")

let pairPtr = UnsafeMutablePointer<pair>.allocate(capacity: 1)
pairPtr.initialize(to: pair())

// Seems like there should be a better way to handle this:
pairPtr.pointee.left = unsafeBitCast(leftVal, to: UnsafePointer<pchar>.self)
pairPtr.pointee.right = unsafeBitCast(rightVal, to: UnsafePointer<pchar>.self)

C代码:

#include "pair.h"
#include <string.h>

pchar*
pstrdup(const pchar* str) {
    return strdup(str);
}

模块定义:

module pair [extern_c] {
    header "pair.h"
    export *
}

1 个答案:

答案 0 :(得分:2)

您可以从UnsafePointer<T>创建UnsafeMutablePtr<T> 只需

let ptr = UnsafePointer(mptr)

使用

/// Creates an immutable typed pointer referencing the same memory as the
/// given mutable pointer.
///
/// - Parameter other: The pointer to convert.
public init(_ other: UnsafeMutablePointer<Pointee>)

UnsafePointer的初始化程序。在你的情况下,例如

p.left = UnsafePointer(leftVal)