2017-02-04 9 views
6

Używam tej zmiennejGetter wewnątrz seter w 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) 
    } 
} 

Ale chcę wiedzieć, że to jest właściwy sposób, aby zadzwonić w środku getter setter? To znaczy:

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

jeśli mogę użyć zamiast /*HOW TO CALL GETTER HERE? */self, to nie działa.

Odpowiedz

9

Możesz po prostu zadzwonić wartość (tick) w swoim seter dostać starą wartość:

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

Standardowa realizacja komputerowej zmiennej z pobierających i ustawiająca jest następujący:

private var stored: String 

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

Nazwa newValue w definicji nastawczym oznacza wartość, która jest stosowana.

Można rzucać następujące do zabaw, aby zobaczyć:

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) 

Jeśli naprawdę chciał odwołać getter w definicji setter, można. Być może chcesz tylko zastosować newValue seter w oparciu o jakiś stan getter:

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

Jest to również ważny i powinien być w stanie dopasować swoje wymagania.

+0

Tak, nie ma mowy, aby zadzwonić getter? – Vyacheslav

+0

Nic nie powstrzyma cię od odniesienia do 'tyk' w definicji setera. @Vyacheslav –

+0

Chcę nazwać gettera. Z tego powodu może zawierać bardziej skomplikowaną logikę – Vyacheslav