Как установить и получить значение указателя Swift
В Objetive-C, когда я хочу установить/изменить значение указателя. Я использую
*pointer = value
Но в Swift, как получить/установить значение указателя?
Я вставляю растровый пиксель:
NSUInteger offsetPixelCountForInput = ghostOrigin.y * inputWidth + ghostOrigin.x;
for (NSUInteger j = 0; j < ghostSize.height; j++) {
for (NSUInteger i = 0; i < ghostSize.width; i++) {
UInt32 * inputPixel = inputPixels + j * inputWidth + i + offsetPixelCountForInput;
UInt32 inputColor = *inputPixel;
newR = MAX(0,MIN(255, newR));
newG = MAX(0,MIN(255, newG));
newB = MAX(0,MIN(255, newB));
*inputPixel = RGBAMake(newR, newG, newB, A(inputColor));
}
}
Итак, я хочу преобразовать этот код в Swift, но я застрял в указателях.
23.03.2016 - Обновить код
var inputPixels:UnsafeMutablePointer<UInt32> = nil
inputPixels = UnsafeMutablePointer<UInt32>(calloc(inputHeight * inputWidth, UInt(sizeof(UInt32))))
Ответы
Ответ 1
Вы можете работать с указателями в Swift. Существуют типовые типы UnsafePointer
и UnsafeMutablePointer
.
Вот функция, которая принимает указатель float
Вы можете использовать переменную float и передать ее адрес &floatVar
или вы можете создать и выделить UnsafeMutablePointer
и передать его. Но вы должны вручную выделять и освобождать память.
Когда вы работаете с типом указателя UnsafeMutablePointer
и хотите присвоить ему какое-то значение, вы должны сделать следующее:
- проверить, указывает ли точка на некоторую переменную (не ноль)
- Назначьте свое значение свойству
memory
Пример кода:
func work (p: UnsafeMutablePointer<Float>) {
if p != nil {
p.memory = 10
}
println(p)
println(p.memory)
}
var f: Float = 0.0
var fPointer: UnsafeMutablePointer<Float> = UnsafeMutablePointer.alloc(1)
work(&f)
work(fPointer)
fPointer.dealloc(1)
Ответ 2
В Swift 3
вы должны использовать свойство pointee
вместо памяти
pointer.pointee = value
Ответ 3
"Как установить и получить значение указателя Swift?" Почему бы просто не делать так, чтобы использовать геттеры и сеттеры! Например:
var myPet = "cat"
func takePetOnWalkNextToNuclearPowerPlant () {
var newPet : String {
get {
return myPet
}
set (value) {
myPet = value
}
}
newPet = "dog"
}
takePetOnWalkNextToNuclearPowerPlant()
print(myPet) // Prints "dog"
Также нет необходимости вручную освобождать объект-указатель из памяти, это делается для вас.