我有一个与C库进行互操作的Swift程序。这个C库返回一个内部有char[]
数组的结构,如下所示:
struct record
{
char name[8];
};
定义已正确导入Swift。但是,该字段被解释为8个Int8
元素(类型为(Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8)
)的元组,我不知道如何使用Swift将其转换为String
。
没有接受Int8
元组的String
初始化器,而且似乎不可能获得指向元组的第一个元素的指针(因为类型可以是异构的,这并不奇怪)。
现在,我最好的想法是创建一个小的C函数,它接受指向结构本身的指针,并将name
作为char*
指针而不是数组返回,并使用该函数。
然而,有没有完全快速的方法呢?
发布于 2014-12-13 14:12:47
实际上,您可以使用Swift的可变参数语法将元组收集到数组中:
let record = getRecord()
let (int8s: Int8...) = myRecord // int8s is an [Int8]
let uint8s = int8s.map { UInt8($0) }
let string = String(bytes: uint8s, encoding: NSASCIIStringEncoding)
// myString == Optional("12345678")
发布于 2014-12-13 14:59:29
我对自己的目的也很感兴趣,所以我添加了一个新函数:
func asciiCArrayToSwiftString(cString:Int8...) -> String
{
var swiftString = String() // The Swift String to be Returned is Intialized to an Empty String
var workingCharacter:UnicodeScalar = UnicodeScalar(UInt8(cString[0]))
var count:Int = cString.count
for var i:Int = 0; i < count; i++
{
workingCharacter = UnicodeScalar(UInt8(cString[i])) // Convert the Int8 Character to a Unicode Scalar
swiftString.append(workingCharacter) // Append the Unicode Scalar
}
return swiftString // Return the Swift String
}
我使用以下命令调用此函数:
let t:Int8 = Int8(116)
let e:Int8 = Int8(101)
let s:Int8 = Int8(115)
let testCString = (t, e, s, t)
let testSwiftString = wispStringConverter.asciiCArrayToSwiftString(testCString.0, testCString.1, testCString.2, testCString.3)
println("testSwiftString = \(testSwiftString)")
结果输出为:
testSwiftString =测试
发布于 2017-03-24 02:51:58
我刚刚在使用Swift 3. (3.0.2)时遇到了类似的问题。我试图在Swift中将CChar,CChar的数组转换为字符串。原来Swift 3有一个字符串初始化器,它将接受一个cString。
示例:
let a = "abc".cString(using: .utf8) // type of a is [CChar]
let b = String(cString: a!, encoding: .utf8) // type of b is String
print("a = \(a)")
print("b = \(b)")
结果:
A=可选(97、98、99、0)
B=可选(“abc”)
请注意,字符串上的cString函数会产生一个可选的。当在创建b的String.init函数中使用它时,它必须被强制解包。这意味着两者最终都可能为零,因此也应该使用错误检查。
https://stackoverflow.com/questions/27455773
复制相似问题