首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组元素的UnsafeMutablePointer

数组元素的UnsafeMutablePointer
EN

Stack Overflow用户
提问于 2018-02-26 10:22:51
回答 1查看 1.7K关注 0票数 3
代码语言:javascript
复制
var a = [1,2,3]
let ptr1 = UnsafeMutablePointer<Int>(&a[0]) //works fine

let index = 0
let ptr2 = UnsafeMutablePointer<Int>(&a[index]) //compiler throws error

错误:不能使用UnsafeMutablePointer<Int>类型的参数列表调用(inout Int)类型的初始化程序

为什么后者不编译?这里有我遗漏的东西吗?

我想做的就像下面的片段。

代码语言:javascript
复制
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
  }
}

如何才能达到上述预期效果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-27 05:20:05

请注意,这两种方法都不是创建UnsafeMutablePointer的有效方法。Swift可以在上次引用之后立即释放一个指针,所以当您使用这些指针时,它们可能是无效的。您想要的工具是a.withUnsafeMutableBufferPointer

尽管如此,这里正确的语法是:

代码语言:javascript
复制
let ptr2 = UnsafeMutablePointer(&a) + index

看看您更新的代码,这在Array上是没有意义的。我认为您假设数组是引用类型。它们是价值类型。没有办法改变一段numbers。对它的任何更改都将整个数组替换为一个完全不同的数组。Swift有一些巧妙的在写上复制技巧来提高效率,而且在实践中它可能并不真正地替换整个数组,但是您应该像编程一样进行编程。您应该考虑以下几行:

代码语言:javascript
复制
array[1] = 2

相当于:

代码语言:javascript
复制
array = <a new array that is identical, but element 1 has been replaced by 2>

这意味着在非常受控制的情况下(例如在Array块内),指向withUnsafeMutableBufferPointer的指针是没有意义的。

你想要的是这样的东西:

代码语言:javascript
复制
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]
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48986177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档