Ios 指向数组元素的不可配置指针

Ios 指向数组元素的不可配置指针,ios,swift,macos,unsafemutablepointer,Ios,Swift,Macos,Unsafemutablepointer,如何实现上述预期结果?请注意,这两种方法都不是创建不可配置指针的有效方法。Swift可以在最后一次引用后立即释放,因此当您使用这些指针时,它们可能无效。您需要的工具是a.withUnsafemtableBufferPointer 也就是说,这里的正确语法是: class Holder { var numbers: [Int] = [1,2,3,4] var modifier: Modifier init(index: Int) { self.modifie

如何实现上述预期结果?

请注意,这两种方法都不是创建不可配置指针的有效方法。Swift可以在最后一次引用后立即释放,因此当您使用这些指针时,它们可能无效。您需要的工具是
a.withUnsafemtableBufferPointer

也就是说,这里的正确语法是:

class Holder {
    var numbers: [Int] = [1,2,3,4]
    var modifier: Modifier

    init(index: Int) {
       self.modifier = Modifier(UnsafeMutablePointer(&self.numbers) + index)
    }

}

class Modifer {
  var ptr: UnsafeMutablePointer<Int>

  init(_ ptr: UnsafeMutablePointer<Int>) {
     self.ptr = ptr
  }

  func change(to: Int) {
     self.ptr.pointee = to
    // expected the change to be reflected in numbers array
    // but as Rob Napier said it became invalid and throws EXC_BAD_ACCESS
  }
}

查看更新后的代码,这在数组中是没有意义的。我认为您假设数组是引用类型。它们是值类型。无法更改一段
数字
。对其所做的任何更改都会将整个阵列替换为完全不同的阵列。Swift有一些巧妙的写时复制技巧来提高效率,实际上它可能不会替换整个数组,但您应该像它那样编程。你应该考虑下面的行:

let ptr2 = UnsafeMutablePointer(&a) + index
相当于:

array[1] = 2

如何将
与unsafemtablebufferpointer一起使用
?当我尝试时,它抛出错误:无法对不可变值使用mutating member:“a”是不可变的。这取决于您想对内容执行什么操作。在块内部,必须使用提供的缓冲区指针。您不能直接访问
a
。目标是什么?我已经更新了问题,以尽量少地描述我实际试图实现的目标。在我最初的例子中,数字数组是一个表示答案的结构数组。你不需要这方面的指针。你想要闭包。
array[1] = 2
array = <a new array that is identical, but element 1 has been replaced by 2>
class Holder {
    var numbers: [Int] = [1,2,3,4]
    private(set) var modifier: ((Int) -> ())! // ! is an artifact of capturing self in init

    init(index: Int) {
        self.modifier = { [weak self] in self?.numbers[index] = $0 }
    }
}

let holder = Holder(index: 2)
holder.numbers  // [1, 2, 3, 4]
holder.modifier(0)
holder.numbers  // [1, 2, 0, 4]