Swift将字符串转换为UnsafeMutablePointer <int8>

时间:2015-05-05 00:48:21

标签: swift pointers xcode6

我有一个映射到Swift的C函数定义为:

func swe_set_eph_path(path: UnsafeMutablePointer<Int8>) -> Void

我正在尝试传递函数的路径并尝试过:

        var path = [Int8](count: 1024, repeatedValue: 0);
        for i in 0...NSBundle.mainBundle().bundlePath.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)-1
        {
            var range = i..<i+1
            path[i] = String.toInt(NSBundle.mainBundle().bundlePath[range])
        }
        println("\(path)")
        swe_set_ephe_path(&path)

但在路径[i]行上我收到错误:

  

&#39;下标&#39;不可用:不能使用范围下标String   INT

swe_set_ephe_path(NSBundle.mainBundle().bundlePath)

,也不

swe_set_ephe_path(&NSBundle.mainBundle().bundlePath)

不能工作

除了不工作之外,我觉得必须有更好,更少复杂的方式来做这件事。使用CString的StackOverflow以前的答案似乎不再适用。有什么建议吗?

4 个答案:

答案 0 :(得分:23)

  

使用CString的StackOverflow以前的答案似乎不再适用

尽管如此,UnsafePointer<Int8>是一个C字符串。如果您的上下文绝对需要UnsafeMutablePointer,请强制执行,如下所示:

let s = NSBundle.mainBundle().bundlePath
let cs = (s as NSString).UTF8String
var buffer = UnsafeMutablePointer<Int8>(cs)
swe_set_ephe_path(buffer)

当然我没有你的swe_set_ephe_path,但是在我的测试中它可以正常工作,如下所示:

func swe_set_ephe_path(path: UnsafeMutablePointer<Int8>) {
    println(String.fromCString(path))
}

答案 1 :(得分:8)

实际上,你正在使用它所需要的库(在C声明中)char * path而不是const char * path,这极其令人恼火。 (这假设函数不会改变输入字符串 - 如果确实如此,那么你处于完全不同的情况。)

如果没有,该函数将以Swift的形式转到:

// note, UnsafePointer not UnsafeMutablePointer
func swe_set_eph_path(path: UnsafePointer<Int8>) -> Void

然后你可以依赖Swift的隐式转换:

let str = "blah"
swe_set_eph_path(str) // Swift implicitly converts Strings 
                      // to const C strings when calling C funcs

但是你可以很容易地与withCString函数结合进行不安全的转换:

str.withCString { cstr in
    swe_set_eph_path(UnsafeMutablePointer(cstr))
}

答案 2 :(得分:7)

我有一个用iOS编写的用C ++编写的静态库(someLibrary.a)。 头文件(someLibrary.h)有一个如下公开的函数:

extern long someFunction(char* aString);

Swift中的声明如下:

Int someFunction(aString: UnsafeMutablePointer<Int8>)

我对String进行了扩展:

extension String {
    var UTF8CString: UnsafeMutablePointer<Int8> {
        return UnsafeMutablePointer((self as NSString).UTF8String)
    }
}

那么我可以像这样调用这个方法:

someFunction(mySwiftString.UTF8CString)

答案 3 :(得分:7)

在当前版本的Swift语言中,您可以这样做(其他答案已过时):

let path = Bundle.main.bundlePath
let param = UnsafeMutablePointer<Int8>(mutating: (path as NSString).utf8String)