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))")
}
如何使用 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))")
}