在Swift中转换变量引用的语法是什么?

时间:2015-07-08 05:46:16

标签: swift

对Swift不熟悉(并且在Swift的指针处理方面存在一些问题)我无法正确解析Xcode给我的错误。有关获取变量引用的任何提示吗?

RGBA是一个只是结构的4 UInt8 s

var data: UnsafeMutablePointer<RGBA> = UnsafeMutablePointer<RGBA>(CGBitmapContextGetData(bitmapContext))
var pixel = &data[offset] // [1] this is the trouble statement

// use the pixel struct to read *and* write

[1]错误

  • &#39; myclass.RGBA&#39;不能转换为&#39; UnsafeMutablePointer&#39;
  • 输入myclass.RGBA&#39;变量无法实现

为什么我能够使用下标运算符(data[offset].r = 0)访问内存,但在设置元素引用(memory)后我使用了var pixel = data[offset]属性?当然必须有一个Swift方式来存储本地的引用吗?

我也可以通过inout参数函数完成相同的操作,即;

func setPixel(inout pixel: RGBA, var r: UInt8, var g: UInt8, var b: UInt8, var a: UInt8) {
  pixel.r = r // I can use pixel directly without '.memory'
}

2 个答案:

答案 0 :(得分:0)

您可以简单地向指针添加偏移量:

let data = UnsafeMutablePointer<RGBA>(CGBitmapContextGetData(bitmapContext))
let pixel = data + offset

然后你可以读/写pixel指向的内存:

let red = pixel.memory.red
pixel.memory.blue = 123

答案 1 :(得分:0)

在做了一些研究(包括与#swift人员交谈)之后,似乎Swift故意禁止这种变量引用(引用数组元素)。

一种解决方案是使用函数来定义引用范围:

func setElem(inout elem: T, var value: T {
  elem = value
}

// can then be used like (which works for address-of array element):
self.setElem(&data[index], elemValue)