2017-02-04 50 views
6

我使用這個變量getter中二傳手在斯威夫特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) 
    } 
} 

但我想知道,這是調用的getter裏面二傳手的正確方法?我的意思是:

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

如果我使用self而不是/*HOW TO CALL GETTER HERE? */,這是行不通的。

回答

9

你可以簡單地調用它的Set中的值(tick)來獲取舊值:

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

的標準實現吸氣劑和setter一個計算變量如下:

private var stored: String 

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

在setter定義名稱newValue表示正在應用的值。

你可以拋出以下到操場上看到:

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) 

如果你真的想引用吸氣劑的setter定義,你可以。也許你會想只有在基於某種的吸氣劑的條件二傳手應用newValue

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

這也是有效的,應該能夠滿足您的需求。

+0

所以,沒辦法打電話消氣? – Vyacheslav

+0

沒有什麼能阻止你在setter定義中引用'tick'。 @Vyacheslav –

+0

我想打電話給getter。因爲它可能包含更復雜的邏輯 – Vyacheslav