将Objective-C内存转换为Swift

时间:2018-11-09 22:21:44

标签: objective-c swift

我的任务是将一些功能从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并不确定这是我们尝试做的最安全的方法。谢谢。

1 个答案:

答案 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
}