gpt4 book ai didi

swift - 在没有 unsafeBitCast 的情况下将 UnsafeMutablePointer 值分配给 UnsafePointer

转载 作者:可可西里 更新时间:2023-11-01 01:19:11 26 4
gpt4 key购买 nike

我正在使用一个 C API,该 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 初始化是否会在堆栈上分配一对结构以初始化堆上分配的对,因为对于结构必须清零的情况,这似乎效率低下。

示例代码如下:

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 *
}

最佳答案

您可以创建一个 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)

关于swift - 在没有 unsafeBitCast 的情况下将 UnsafeMutablePointer 值分配给 UnsafePointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44676637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com