2015-12-23 44 views
9

我有一個屬性斯威夫特可以偷懶didSet一起設置

public lazy var points: [(CGFloat,CGFloat,CGFloat)] = { 
     var pointsT = [(CGFloat,CGFloat,CGFloat)]() 
     let height = 100.0 
     for _ in 1...10 { 
      pointsT.append((someValue,someValue,100.0)) 
     } 
     return pointsT 
    }() 

,我想添加一個didSet方法,這可能嗎?

+0

什麼是'ar' in'for p in ar'? – dfri

+1

改變了它,與問題無關。謝謝。 –

回答

13

簡答題:沒有。

試着在你的某個類或方法,這個簡單的例子:

lazy var myLazyVar: Int = { 
    return 1 
}() { 
    willSet { 
     print("About to set lazy var!") 
    } 
} 

這給你以下編譯時錯誤:

Lazy properties may not have observers.


關於let聲明另一個答案:懶惰變量不是必要的只是「讓常量延遲初始化」。請看下面的例子:

struct MyStruct { 
    var myInt = 1 

    mutating func increaseMyInt() { 
     myInt += 1 
    } 

    lazy var myLazyVar: Int = { 
     return self.myInt 
    }() 
} 

var a = MyStruct() 
print(a.myLazyVar) // 1 
a.increaseMyInt() 
print(a.myLazyVar) // 1: "initialiser" only called once, OK 
a.myLazyVar += 1 
print(a.myLazyVar) // 2: however we can still mutate the value 
        // directly if we so wishes 
+1

你對此絕對正確,將從我的答案中刪除,然後基本上讀取「不」:)你走了! – luk2302

2

沒有

points是一個常數,不能設置任何東西給它。與let常數唯一的區別在於它稍後可能會被初始化。

This answer提供了一些有關爲什麼在lazy情況下使用var而不是let的更多信息。

編輯:使答案不看空this blog post看看這裏筆者提出了關於爲什麼觀察lazy增值經銷商可能不會尚未支持幾個有效點。 oldValue應該在觀察者? nil?這在你的非可選情況下不是一個好主意。

+0

*「與let常數唯一的區別在於它(可能)在稍後初始化」*,但這不是真的。懶惰的變量也可以用作var':s,參見我添加的例子。 – dfri

+0

關於編輯:我同意,好的補充。另外,你之前在某種程度上認爲懶惰的var * should *在初始化後通常表現得相當不可變,因爲通常我們在(large?)類或結構實例上使用lazy vars,它們本身不會改變(即使它們的成員變異;但我們可以爲此分開觀察員)。因此,我們在我們的惰性變量的初始化程序中擁有自己的'once-only-willSet'(例如print「Will be set!」)。所以也許蘋果打算(習慣上說)惰性變量在init之後不會改變,這也是爲什麼沒有道具的另一個原因。觀察員。 – dfri

4

簡短的回答是其他說的是「不」,但有一種方式來獲得使用內部隱藏懶var和VAR計算的效果。

private lazy var _username: String? { 
    return loadUsername() 
} 
var username: String? { 
    set { 
     // Do willSet stuff in here 
     if newValue != _username { 
      saveUsername(newValue) 
     } 
     // Don't forget to set the internal variable 
     _username = newValue 
     // Do didSet stuff here 
     // ... 
    } 
    get { 
     return _username 
    } 
}