Anladığım kadarıyla, set ve get, hesaplanan özellikler içindir ( depolanan özelliklerden destek yok )
Objective-C'den geliyorsan, adlandırma kurallarının değiştiğini aklından çıkar. Swift'te bir iVar veya örnek değişkeni saklanan özellik olarak adlandırılır
Örnek 1 (salt okunur özellik) - uyarı ile:
var test : Int {
get {
return test
}
}
Bu bir uyarı ile sonuçlanır, çünkü bu özyinelemeli bir işlev çağrısıyla sonuçlanır (alıcı kendisini çağırır).
Örnek 2. Koşullu okuma / yazma - uyarı ile
var test : Int {
get {
return test
}
set (aNewValue) {
//I've contrived some condition on which this property can be set
//(prevents same value being set)
if (aNewValue != test) {
test = aNewValue
}
}
}
Benzer bir sorun - tekrar tekrar ayarlayıcı çağırdığı için bunu yapamazsınız . Ayrıca, başlatılacak depolanmış özellik olmadığından bu kodun başlatıcılardan şikayet etmeyeceğini unutmayın .
Örnek 3. hesaplanmış özelliği okuma / yazma - destek deposu ile
Burada, gerçek bir saklanan özelliğin koşullu ayarına izin veren bir model bulunmaktadır
//True model data
var _test : Int = 0
var test : Int {
get {
return _test
}
set (aNewValue) {
//I've contrived some condition on which this property can be set
if (aNewValue != test) {
_test = aNewValue
}
}
}
Not Gerçek veriler _test olarak adlandırılır (herhangi bir veri veya veri birleşimi olsa da) Ayrıca _test aslında bir örnek değişkeni olduğu için bir başlangıç değeri sağlama ihtiyacına da (alternatif olarak bir init yöntemi kullanmanız gerekir) dikkat edin.
Örnek 4. Vasiyetnameyi kullanma
//True model data
var _test : Int = 0 {
//First this
willSet {
println("Old value is \(_test), new value is \(newValue)")
}
//value is set
//Finaly this
didSet {
println("Old value is \(oldValue), new value is \(_test)")
}
}
var test : Int {
get {
return _test
}
set (aNewValue) {
//I've contrived some condition on which this property can be set
if (aNewValue != test) {
_test = aNewValue
}
}
}
Burada willSet ve didSet'in gerçek bir saklanan özellikteki değişikliği durdurduğunu görüyoruz. Bu, bildirim gönderme, senkronizasyon vb. İçin kullanışlıdır ... (aşağıdaki örneğe bakın)
Örnek 5. Somut Örnek - ViewController Kabı
//Underlying instance variable (would ideally be private)
var _childVC : UIViewController? {
willSet {
//REMOVE OLD VC
println("Property will set")
if (_childVC != nil) {
_childVC!.willMoveToParentViewController(nil)
self.setOverrideTraitCollection(nil, forChildViewController: _childVC)
_childVC!.view.removeFromSuperview()
_childVC!.removeFromParentViewController()
}
if (newValue) {
self.addChildViewController(newValue)
}
}
//I can't see a way to 'stop' the value being set to the same controller - hence the computed property
didSet {
//ADD NEW VC
println("Property did set")
if (_childVC) {
// var views = NSDictionaryOfVariableBindings(self.view) .. NOT YET SUPPORTED (NSDictionary bridging not yet available)
//Add subviews + constraints
_childVC!.view.setTranslatesAutoresizingMaskIntoConstraints(false) //For now - until I add my own constraints
self.view.addSubview(_childVC!.view)
let views = ["view" : _childVC!.view] as NSMutableDictionary
let layoutOpts = NSLayoutFormatOptions(0)
let lc1 : AnyObject[] = NSLayoutConstraint.constraintsWithVisualFormat("|[view]|", options: layoutOpts, metrics: NSDictionary(), views: views)
let lc2 : AnyObject[] = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: layoutOpts, metrics: NSDictionary(), views: views)
self.view.addConstraints(lc1)
self.view.addConstraints(lc2)
//Forward messages to child
_childVC!.didMoveToParentViewController(self)
}
}
}
//Computed property - this is the property that must be used to prevent setting the same value twice
//unless there is another way of doing this?
var childVC : UIViewController? {
get {
return _childVC
}
set(suggestedVC) {
if (suggestedVC != _childVC) {
_childVC = suggestedVC
}
}
}
BOTH hesaplanmış ve depolanmış özelliklerin kullanımına dikkat edin. Ben aynı değeri iki kez (kötü şeyler olmasını önlemek için!) Ayarlanmasını önlemek için hesaplanan bir özellik kullandım; ViewControllers için bildirimleri iletmek için willSet ve didSet kullandım (bkz. UIViewController belgeleri ve viewController kapsayıcıları hakkında bilgi)
Umarım bu yardımcı olur ve burada herhangi bir hata yaptıysam birisi bağırır!
get
&set
) temel olarak başka bir mülke dayanarak hesaplanan bir özelliğe sahip olmalıdır, örneğin bir etiketintext
bir yıla dönüştürülmesiInt
.didSet
&willSet
demek ki var ... hey bu değer ayarlandı, şimdi bunu yapalım örneğin dataSource'umuz güncellendi ... öyleyse yeni satırları içerecek şekilde tableView'i yeniden yükleyelim. Başka bir örnek için dfri'nin delegeleri nasıl arayacağına dair cevabadidSet