将C字符串数组转换为Swift字符串数组

时间:2016-07-17 15:06:52

标签: arrays swift pointers type-conversion swift3

在Swift 3中,带有签名const char *f()的C函数在导入时映射到UnsafePointer<Int8>! f()。它的结果可以转换为Swift字符串:

let swiftString = String(cString: f())

问题是,如何将NULL终止的C字符串C字符串映射到Swift字符串数组?

原始C签名:

const char **f()

导入的Swift签名:

UnsafeMutablePointer<UnsafePointer<Int8>?>! f()

Swift数组字符串:

let stringArray: [String] = ???

1 个答案:

答案 0 :(得分:11)

据我所知,没有内置方法。 你必须迭代返回的指针数组,将C字符串转换为Swift String,直到找到nil指针:

if var ptr = f() {
    var strings: [String] = []
    while let s = ptr.pointee {
        strings.append(String(cString: s))
        ptr += 1
    }
    // Now p.pointee == nil.

    print(strings)
}

备注: Swift 3使用可选指针作为nil的指针。 在您的情况下,f()返回一个隐式解包的可选项,因为 头文件不是&#34;审计&#34;:编译器不知道是否 该函数可以返回NULL或不返回。

使用&#34;可空性注释&#34;你可以提供这些信息 到Swift编译器:

const char * _Nullable * _Nullable f(void);
// Imported to Swift  as
public func f() -> UnsafeMutablePointer<UnsafePointer<Int8>?>?

如果函数可以返回NULL

const char * _Nullable * _Nonnull f(void);
// Imported to Swift  as
public func f() -> UnsafeMutablePointer<UnsafePointer<Int8>?>

如果f()保证返回非NULL结果。

有关可空性注释的更多信息,请参阅 在Swift博客中Nullability and Objective-C