2016-03-07 59 views
0

在C++ mutable关键字中是否存在等价的swift?我有一个实现协议的结构,包括一个非变异函数,但是实现在内部会改变内部状态。有没有什么办法可以让这个类的成员var变为可变的,而不需要改变协议定义,使得函数mutating相当于C++ mutable关键字的Swift结构?

例如

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? 
    ... 
} 

回答

0

我不认为有一种方法可以做你正在尝试做其他协议的语义比改变为mutating F()

你唯一的选择是创建一个新的不同诱变协议版本P MutatingP,然后结构扩展为MutatingP。这可以有mutating func f()功能,您可以在结构中执行

尽管这与其他答案基本相同。

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

底线它保持协议的unmutating语义,但仍然让你变异变量。可以使用相同的方法设计更简单的方法。

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)")