Подтвердить что ты не робот

Как установить и получить значение указателя 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))))
4b9b3361

Ответ 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"

Также нет необходимости вручную освобождать объект-указатель из памяти, это делается для вас.