Array/Vec 指针 foreach c(rust 中的 ffi c)到 swift

Array/Vec pointer foreach c (ffi c in rust) to swift

如何使用 foreach 读取数组 swift 中的字符串值?

我的 Rust 代码是:

#[repr(C)]
pub struct DynArray {
    array: *mut CharTest,
    length: size_t,
}

#[repr(C)]
pub struct CharTest {
    char_test: *const c_char,
}

#[no_mangle] // *const c_char
pub extern "C" fn simple_svg(max_size: c_double) -> DynArray {
    let data = DataChartNatalC {
        year: 2000,
        month: 01,
        day: 01,
        hourf32: 0.0,
        hour: 0,
        min: 0,
        sec: 0.0,
        lat: 0.0,
        lng: 0.0,
    };
    let mut v: Vec<CharTest> = Vec::new();
    v.push(CharTest {
        char_test: CString::new(astrology_draw_svg::chart(
            max_size as f32,
            data,
        ))
        .unwrap()
        .into_raw(),
    });
    v.push(CharTest {
        char_test: CString::new("test").unwrap().into_raw(),
    });

    let result = DynArray {
        array: v.as_mut_ptr(),
        length: v.len() as _,
    };
    std::mem::forget(v);
    result
}

header.h 是:

#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

typedef struct {
  const char *char_test;
} CharTest;

typedef struct {
  CharTest *array;
  size_t length;
} DynArray;


DynArray simple_svg(double max_size);

在 swift 中,我不知道最好的 foreach 归档方法是什么

我试过了

            let test = simple_svg(maxSize)
            for t in test.array {
                print("Test: {}", String.init(t.char_test))
s            }

但是我有这个错误:

Type 'UnsafeMutablePointer?' does not conform to protocol 'Sequence'

不能在指针上使用 for-in。由于错误消息清楚地表明您需要某种符合 Sequence.

的类型

使用指针的 Sequence 的一个例子是 UnsafeMutableBufferPointer。 您可以将结果类型 DynArray 转换为 UnsafeMutableBufferPointer<CharTest>.

extension DynArray {
    var asBufferPointer: UnsafeMutableBufferPointer<CharTest> {
        return UnsafeMutableBufferPointer(start: array, count: length)
    }
}

并像这样使用它:

let test = simple_svg(maxSize)
for t in test.asBufferPointer {
    print("Test: \(String(cString: t.char_test))")
}

或者您可以使用索引访问元素,无需此类转换:

for index in 0..<test.length {
    let t = test.array[index]
    print("Test: \(String(cString: t.char_test))")
}