【问题标题】:Swift struct equivalent to C++ mutable keyword?相当于 C++ 可变关键字的 Swift 结构?
【发布时间】:2016-06-21 02:36:30
【问题描述】:

C++ mutable 关键字在 swift 中是否有等价物?我有一个实现包含非变异函数的协议的结构,但是内部实现确实会改变内部状态。有没有办法通过这个函数使类的成员变量可变,而不改变协议定义,使函数mutating

例如

public protocol P {
    // f is semantically unmutating
    func f
}

public struct S : P {
    // f is semantically unmutating, but does change some internal state
    public func f {
        v += 1
    }
    private var v: Int // How to mark this as mutable for internal purposes?
    ...
}

【问题讨论】:

    标签: swift mutable mutating-function


    【解决方案1】:

    我认为除了将协议的语义更改为 mutating f() 之外,没有其他方法可以做你想做的事情

    您唯一的选择是创建协议 P MutatingP 的新变异版本,然后让结构扩展 MutatingP。这可以具有您可以在结构中实现的mutating func f() 函数

    不过,这与其他答案基本相同。

    这是另一个非常歪曲的解决方案。但它有点满足你的要求。您将需要使用两个全局变量。一个Int 变量Vstruct S 变量aStruct。代码几乎是不言自明的。这种方法最大的问题是你不能同时拥有两个结构实例。但这可以通过使用结构数组而不是单个结构来处理。

    底线它保留了协议的不变语义,但仍然允许您改变变量。可以使用相同的方法设计更简单的方法。

    import UIKit
    
    protocol P {
        func f()
    }
    
    var aStruct:S!
    var V = 100 {
        didSet {
            print("changed V to \(V)")
            if var s = aStruct {
                s.v = 200
            }
        }
    }
    
    struct S : P  {
        var v:Int = 100 {
            didSet {
                aStruct = self
            }
        }
        init() {
            aStruct = self
        }
        func f() {
            V = 200
        }
    }
    
    let s = S()
    s.f()
    print("s.v = \(s.v)...aStruct.v = \(aStruct.v)")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 2010-12-10
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多