不使用NSString,将Swift String与NSData一起使用

33

是否可以初始化Swift字符串(而不是NSString)以NSData对象的内容,而不必先创建一个NSString?

我知道我可以在NSString中使用这个:

var datastring = NSString(data data: NSData!, encoding encoding: UInt)

但是我该如何使用基本的Swift String类型?我以为Swift字符串和NSString是可以互换的,我真的必须使用NSString从NSData中获取数据,然后将该值赋给Swift字符串吗?

3个回答

51

从Swift 1.2开始,它们并不完全可互换,但是它们是可以相互转换的,因此在需要时没有理由不使用NSString及其构造函数。这将很好地工作:

var datastring = NSString(data:data, encoding:NSUTF8StringEncoding) as! String

as!是必需的,因为NSString(...)可能会针对无效输入返回nil - 如果您不确定数据表示有效的UTF8字符串,您可能希望改用以下方法返回String?(又名Optional<String>)。

var datastring = NSString(data:data, encoding:NSUTF8StringEncoding) as String?

构建完成后,您可以像使用任何其他Swift字符串一样使用datastring,例如:

var foo = datastring + "some other string"

当我尝试解析JSON字符串时,数据字符串返回部分JSON响应。但是当我删除String类型时,它会返回完整的响应。有什么想法吗? - iPhone Guy
这给了我一个运行时致命错误:在解包可选值时意外地发现了nil,打印出的数据字符串显示它不是nil。 - Jason G
1
@naturalc,数据可能不是有效的UTF8字符串。尝试使用其他编码方式,或编写一些代码在转换为字符串之前尝试检测编码方式。 - Nick Lockwood
没有,那只是数字而已,但我选择了另一种方法。 - Jason G
5
对于 Swift 1.2 版本,您需要在调用 NSString() 结尾处添加 as! String - phatblat

12
var buffer = [UInt8](count:data.length, repeatedValue:0)
data.getBytes(&buffer, length:data.length)
var datastring = String(bytes:buffer, encoding:NSUTF8StringEncoding)

这是唯一一个真正回答了问题的答案! - WaterNotWords
这有点误导人。bytes:encoding:是来自Foundation的,因此NSString仍然通过Objective-C桥接被使用。 - Luke

3
在Swift 2.0中,你可以像这样做:-
import Foundation

var dataString = String(data: YourData, encoding: NSUTF8StringEncoding)

在 Swift 3.0 中:-
import Foundation

var dataString = String(data: data, encoding: String.Encoding.utf8)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接