我的任务是将一些功能从Objective-C转换为Swift。我们正在使用C文件将文件传输到蓝牙设备。这是需要转换的Objective-C代码。
从Objective-C文件中:
NSString *room_name = filename;
NSData* bytes = [room_name dataUsingEncoding:NSUTF8StringEncoding];
UInt8 buff_name[bytes.length+1];
memcpy(buff_name, [room_name UTF8String],[room_name lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1);
我在memcpy
上坚持使用Swift并不确定这是我们尝试做的最安全的方法。谢谢。
答案 0 :(得分:3)
我的哀悼,因为您得到的代码有些混乱。首先,它从 String redirectLocation;
Header locationHeader = method.getResponseHeader("location");
if (locationHeader != null) {
redirectLocation = locationHeader.getValue();
} else {
// The response is invalid and did not provide the new location for
// the resource. Report an error or possibly handle the response
// like a 404 Not Found error.
}
生成一个NSData
,然后在处理过程中将字符串转换为UTF-8,但随后除了确定大小之外,它不使用该room_name
。缓冲区,然后将字符串再次转换为UTF-8 并将其复制到新缓冲区中。从计算和可读性的角度来看,这比需要的效率要低得多。
如果我们将其保留在Objective-C中,我们已经想要清理代码。但是,在Swift中,我们可以使其更加整洁,因为NSData
有一个非常好的方法,可以让我们获得指向字符串的UTF-8表示形式的指针:
String
请注意,您在此处获得的指针是不可变的。如果您要调用的C函数希望能够修改缓冲区,则需要创建一个副本。有几种方法可以做到这一点,但是最简单的方法可能只是:
filename.withCString { ptr in
// call whatever C-based functions expect a `const char *` pointer here
}