当前位置: 动力学知识库 > 问答 > 编程问答 >

Converting array of C strings to Swift string array

问题描述:

In Swift 3, C function with signature const char *f() is mapped to UnsafePointer<Int8>! f() on import. It's result can be converted to a Swift string as:

let swiftString = String(cString: f())

The question is, how a NULL terminated C array of C strings can be mapped to Swift array of strings?

The original C signature:

const char **f()

Imported Swift signature:

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

Swift array of strings:

let stringArray: [String] = ???

网友答案:

There is no built-in method as far as I know. You have to iterate over the returned pointer array, converting C strings to Swift Strings, until a nil pointer is found:

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)
}

Remark: Swift 3 uses optional pointers for pointers that can be nil. In your case, f() returns an implicitly unwrapped optional because the header file is not "audited": The compiler does not know whether the function can return NULL or not.

Using the "nullability annotations" you can provide that information to the Swift compiler:

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

if the function can return NULL, and

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

if f() is guaranteed to return a non-NULL result.

For more information about the nullability annotations, see for example Nullability and Objective-C in the Swift blog.

分享给朋友:
您可能感兴趣的文章:
随机阅读: