【问题标题】: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 变量V 和struct 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)")