2016-03-07 68 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)")