2017-02-04 3 views
6

Ich verwende diese VariableGetter innerhalb Setter in Swift 3

public var tick: Int64 { 
    get { 
     return UserDefaults.standard.object(forKey: TICK) as? Int64 ?? 0 
    } 
    set(v) { 
     let cur = UserDefaults.standard.object(forKey: TICK) as? Int64 ?? 0 + v 
     UserDefaults.standard.set(cur, forKey: TICK) 
    } 
} 

Aber ich möchte wissen, das ist der richtige Weg, Getter in innerhalb Setter zu nennen? Ich meine:

set(v) { 
    let cur = /*HOW TO CALL GETTER HERE? */ + v 
    UserDefaults.standard.set(cur, forKey: TICK) 
} 

wenn ich self anstelle von /*HOW TO CALL GETTER HERE? */, es funktioniert nicht.

Antwort

9

Sie können einfach den Wert nennen (tick) innerhalb seines Setter den alten Wert zu erhalten:

public var tick: Int64 { 
    get { 
     return UserDefaults.standard.object(forKey: TICK) as? Int64 ?? 0 
    } 
    set(v) { 
     let cur = tick + v 
     UserDefaults.standard.set(cur, forKey: TICK) 
    } 
} 
1

eine Standardimplementierung eines berechneten Variable mit Getter und Setter ist wie folgt:

private var stored: String 

public var computed: String { 
    get { 
     return stored 
    } 
    set { 
     stored = newValue 
    } 
} 

Der Name newValue in einer setter Definition steht für den Wert, der angewendet wird.

Sie konnten die folgenden in einen Spielplatz werfen, um zu sehen:

struct SomeStruct { 
    private var stored: String = "" 

    public var computed: String { 
     get { 
      return self.stored 
     } 
     set { 
      self.stored = newValue 
     } 
    } 
} 

var value = SomeStruct() 
print(value.computed) 
value.computed = "new string" 
print(value.computed) 

Wenn Sie wirklich das Getter in Ihrer Setter Definition verweisen wollte, Sie könnten. Vielleicht würden Sie wollen nur die newValue in der auf einer Art Zustand des Getter basierend Setter gelten:

public var computed: String { 
    get { 
     return self.stored 
    } 
    set { 
     self.stored = self.computed == "" ? self.computed : newValue 
    } 
} 

Dies gilt auch und sollten Ihre Anforderungen anpassen können.

+0

also keine Möglichkeit Getter zu nennen? – Vyacheslav

+0

Es gibt nichts, was Sie daran hindert, in Ihrer Setter-Definition auf "tick" zu verweisen. @Vyacheslav –

+0

Ich möchte Getter anrufen. Weil es möglicherweise kompliziertere Logik enthält – Vyacheslav