2017-05-06 76 views
0

从C API填写的size_t我有斯威夫特 - 如何通过指针

void Fill(size_t * val){ 
    *val = 15; 
} 

一个C API我如何可以调用此方法从斯威夫特3和填充内部类变量var number?另外,它应该有什么类型?

回答

2

如果打开在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

+0

只是一个小挑剔:由于Swift已经开源,根据平台'size_t'可能有不同的类型。在Swift端使用它之前,检查'size_t'的具体类型总是一个好主意。除此之外,很好的答案:) –

+0

@PedroCastilho:是的,但“跳转到生成的接口”将始终显示具体类型,如果您传递不兼容的变量(因为Swift没有隐式类型转换),编译器会抱怨。 –

+0

@PedroCastilho:更新答案以满足您的关注,感谢您的反馈! –

1

首先,您需要在平台上找到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) 
    } 
}