![](/img/trans.png)
[英]iOS: Convert UnsafeMutablePointer<Int8> to String in swift?
[英]Swift convert string to UnsafeMutablePointer<Int8>
我有一个 C function 映射到 Swift 定义为:
func swe_set_eph_path(path: UnsafeMutablePointer<Int8>) -> Void
我正在尝试将路径传递给 function 并尝试过:
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)
但是在 path[i] 行我得到了错误:
“下标”不可用:无法下标具有 Int 范围的字符串
swe_set_ephe_path(NSBundle.mainBundle().bundlePath)
也不
swe_set_ephe_path(&NSBundle.mainBundle().bundlePath)
也不工作
除了不工作之外,我觉得必须有一种更好、更简单的方法来做到这一点。 以前使用 CString 的 StackOverflow 答案似乎不再有效。 有什么建议么?
使用CString的StackOverflow以前的答案似乎不再起作用了
然而, UnsafePointer<Int8>
是一个C字符串。 如果你的上下文绝对需要一个UnsafeMutablePointer
, 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))
}
它实际上非常刺激你正在使用的库,它需要(在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))
}
在当前版本的Swift语言中,您可以这样做(其他答案已过时):
let path = Bundle.main.bundlePath
let param = UnsafeMutablePointer<Int8>(mutating: (path as NSString).utf8String)
我有一个用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)
更新:制作字符串扩展(swift 5.7)
extension String {
var UTF8CString: UnsafeMutablePointer<Int8> {
return UnsafeMutablePointer(mutating: (self as NSString).utf8String!)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.