Я довольно новичок в Swift, и у меня мало опыта работы с C.
Я пытаюсь написать функцию на C, которая получит строку Swift, с которой я потом смогу что-то сделать.Проблема в том, что я не уверен на 100%, какой тип должен быть в Swift, чтобы Си нравилось тому, что он видит.
До сих пор я нашел несколько примеров в стеке, которые кажутся хорошими отправными точками, но некоторые примеры кажутся устаревшими для текущей версии Swift.
Я впервые начал с использования этого примера, чтобы C и Swift общались друг с другом: Swift, вызов C, вызов Swift? Затем я взял это и попытался обновить функцию Swift, чтобы она возвращала строкукакой-то.Я понимаю, что это должен быть тип возврата UTF-8, но я не уверен, как правильно отправлять сообщения.Я смотрел на Как передать строку Swift в функцию переменного тока? , Как преобразовать строку в UnsafePointerи длиной и Как преобразовать строку в строку Unicode (UTF-8) в Swift? , но ни одна из них на самом деле не работает для решения.Или я просто набираю это неправильно.Пока что самое близкое, что я могу получить к возврату чего-либо, это следующее:
В Swift мой ViewController
:
import UIKit
class ViewController: UIViewController {
@_silgen_name("mySwiftFunc") // give the function a C name
public func mySwiftFunc(number: Int) -> [CChar]
{
print("Hello from Swift: \(number)")
let address: String = "hello there";
let newString = address.cString(using: String.Encoding.utf8)
return newString!
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
blah()
}
}
А в C заголовок выглядит так:
#ifndef cfile_h
#define cfile_h
#include <stdio.h>
const char * mySwiftFunc(int);
int blah(void);
#endif /* cfile_h */
И источник выглядит так:
#include "cfile.h"
int blah() {
const char * retVal = mySwiftFunc(42); // call swift function
printf("Hello from C: %s", retVal);
return 0;
}
Существует файл заголовка моста, который просто имеет #include "cfile.h"
.Очевидно, что в первом примере еще много остатков, и они будут вычищены позже.
Что нужно изменить, чтобы сделать эту работу?Прямо сейчас консоль выплевывает
Hello from Swift: 42
Hello from C: (B\214