2017-02-04 51 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