我对Swift还不太熟悉,对C的接触也不多。
我正在尝试编写一个在C中获取Swift字符串并进行处理的函数。问题是,我不确定在Swift中应该使用什么类型才能让C看到它时喜欢。
到目前为止,我在Stack上找到了几个好的起点示例,但有些示例似乎已经过时了。
一开始,我使用了Swift call C call Swift?这个例子让C和Swift相互交流。 然后,我尝试更新Swift函数以返回某种字符串。我知道它需要是UTF-8返回类型,但我不确定如何正确地发送它们。 我已经查看了How to pass a Swift string to a c function?、How to convert String to UnsafePointer<UInt8> and length和How to convert string to unicode(UTF-8) string in 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