从C API填写的size_t我有斯威夫特 - 如何通过指针
void Fill(size_t * val){
*val = 15;
}
一个C API我如何可以调用此方法从斯威夫特3和填充内部类变量var number
?另外,它应该有什么类型?
从C API填写的size_t我有斯威夫特 - 如何通过指针
void Fill(size_t * val){
*val = 15;
}
一个C API我如何可以调用此方法从斯威夫特3和填充内部类变量var number
?另外,它应该有什么类型?
如果打开在Xcode的C头文件,并从Xcode的菜单中选择“Navigate->跳转到生成的接口”,那么你会看到 功能导入到斯威夫特
public func Fill(_ val: UnsafeMutablePointer<Int>!)
你通过使用作为&
INOUT表达一个初始化 变量的地址从夫特调用它,比较"Interacting with C APIs":
易变指针
当一个函数被声明为接受一个
UnsafeMutablePointer<Type>
参数,它可以接受任何以下的:
- ...
- 一种在出包含一个可变变量表达式,属性或下标参考类型为
Type
,它作为指针传递给可变值的地址。- ...
你的情况:
var myval = 0 // Type is `Int`
Fill(&myval)
但斯威夫特定义size_t
以及
public typealias size_t = Int
因此你可以(甚至更好)定义变量
var myval: size_t = 0
然后它也可以在其他平台上编译,这些平台可以以不同方式定义 size_t
。
首先,您需要在平台上找到size_t
的实际基本类型。然后,你可以使用this table来找出你需要使用这个函数的类型。举例来说,假设size_t
是#define
别名unsigned long
,这个功能的雨燕签名会:
func Fill(_ val: UnsafeMutablePointer<CUnsignedLong>!)
由于Objective-C的是C严格的超集,你可以C文件添加到项目中the same way you would add Objective-C files:创建一个桥接头并导入你想要在其中使用的功能。
一旦你创建了一个桥接头并导入了相应的头文件,你应该可以从Swift代码中调用Fill
而没有问题。你应该能够使用它如下:
import Foundation
class SomeClass {
var number: CUnsignedLong = 0
func someMethod() {
Fill(&number)
}
}
只是一个小挑剔:由于Swift已经开源,根据平台'size_t'可能有不同的类型。在Swift端使用它之前,检查'size_t'的具体类型总是一个好主意。除此之外,很好的答案:) –
@PedroCastilho:是的,但“跳转到生成的接口”将始终显示具体类型,如果您传递不兼容的变量(因为Swift没有隐式类型转换),编译器会抱怨。 –
@PedroCastilho:更新答案以满足您的关注,感谢您的反馈! –