Массив / Ve c указатель foreach c (ffi c в ржавчине) для быстрого - PullRequest
0 голосов
/ 12 марта 2020

Как я могу прочитать строковое значение в swift моего массива с помощью foreach?

Мой код в ржавчине:

#[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
}

Заголовок .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            }

Но у меня есть эта ошибка:

Тип "UnsafeMutablePointer?" не соответствует протоколу «Последовательность»

1 Ответ

3 голосов
/ 12 марта 2020

Вы не можете использовать 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))")
}
...