Swift 将结构转换为NSData

Swift 将结构转换为NSData,swift,nsdata,Swift,Nsdata,这一点非常清楚,并且有效: struct DEMO { var used: Bool = false; } var a = DEMO() var dataA = NSData(bytesNoCopy: &a, length: sizeof(DEMO)) 这是有意义的,因为此方法使用CMutableVoidPointer 现在使用常量: let b = DEMO(used:true) var dataC = NSData(bytes: &b, length: sizeof

这一点非常清楚,并且有效:

struct DEMO {
   var used: Bool = false;
}

var a = DEMO()
var dataA = NSData(bytesNoCopy: &a, length: sizeof(DEMO))
这是有意义的,因为此方法使用CMutableVoidPointer

现在使用常量:

let b = DEMO(used:true)
var dataC = NSData(bytes: &b, length: sizeof(DEMO)) // ERROR
var dataB = NSData(bytesNoCopy: &b, length: sizeof(DEMO))  // ERROR
两个init方法都会出错,但为什么

我真的必须先将const复制到var中才能使用它吗

var c = b
var dataC = NSData(bytes: &c, length: sizeof(DEMO))
我认为这就是为什么函数中出现类似问题的原因,你会得到一个“let”:

所有这些都会产生错误


如何使用NSData处理swift const?

基于Martin R的评论,我建议为功能部件提供一种“变通”解决方案

func test(inout data: DEMO) {
  var a = NSData(bytesNoCopy: &data, length: sizeof(DEMO),freeWhenDone:false)

  .... 
}

inout参数至少提供了一个非成本版本的数据。

我假设您无法获取Swift常量的地址(但我没有确定的引用)。-请注意,不应使用“no copy”变量,因为在这种情况下,NSData对象在释放时调用内存缓冲区上的free()。这也是我在这里的经历:。使用
NSData(bytesNoCopy…
时,只要NSData对象超出范围,您就会得到一个“无效自由”。那么,“无效自由”应该可以由
NSData处理(bytesNoCopy:&data,length:sizeof(DEMO),freeWhenDone:false)
对吗?是的,您完全正确。但是
让b=DEMO(used:true);测试(&b)
仍然不起作用。因此,在某个时刻,您必须为常量创建一个“var”副本。是的,这是正确的,但如果在var或const之外使用,您必须始终在independe中创建一个var副本。
func test(inout data: DEMO) {
  var a = NSData(bytesNoCopy: &data, length: sizeof(DEMO),freeWhenDone:false)

  .... 
}