【问题标题】:Why a struct declared by let can be changed?为什么 let 声明的结构可以更改?
【发布时间】:2018-04-27 07:09:06
【问题描述】:

在下面的代码中,'ptr' 是一个由 let 声明的结构体,但是它的成员变量 'pointee' 可以被改变,为什么?
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1) ptr.pointee = 1

【问题讨论】:

    标签: swift struct let unsafemutablepointer


    【解决方案1】:

    这里,ptr 是常量,所以你不能给它分配一个新的UnsafeMutablePointer,但是它的结构是可以修改的。简而言之,您无法将任何内容重新分配给 let 实体,但您可以访问和修改其属性。

    【讨论】:

      【解决方案2】:

      指针不是结构。

      它是一个引用类型,不像结构是值类型。

      由于您将指针声明为可变的,因此您可以更改 pointee(内存的内容),但不能更改引用本身。

      【讨论】:

      • @DávidPásztor 指针被声明为UnsafeMutablePointer
      • 我的错,我以为你的意思是声明是可变/不可变的,而不是指针本身的类型。
      • struct UnsafeMutablePointer 是一个结构体。
      【解决方案3】:

      UnsafeMutablePointer 一个结构体,但它声明了

      public struct UnsafeMutablePointer<Pointee> : Strideable, Hashable {
      
          public var pointee: Pointee { get nonmutating set }
          public subscript(i: Int) -> Pointee { get nonmutating set }
      
      }
      

      这里的“nonmutating set”是指设置属性不发生变异 指针变量本身的状态。

      因此即使ptr 也可以为ptr.pointee 分配一个新值 是一个常数,下标设置器也是如此:

      let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
      ptr.pointee = 1
      ptr[0] = 2
      

      【讨论】:

        【解决方案4】:

        如果是指针,您无法更改它指向的内存地址,但您可以更改存储在该内存地址的数据。 指针只是存储对内存地址的引用,所以只要该地址是常量,指针就不会改变它的值。

        【讨论】:

          猜你喜欢
          • 2016-08-19
          • 1970-01-01
          • 1970-01-01
          • 2019-05-16
          • 2020-12-17
          • 2018-08-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多