Bir yapıdaki statik değişkenleri varsayılan değerlerine nasıl sıfırlayabilirim-Swift

0

Soru

Uygulamam boyunca kullanmam gereken bazı statik değişkenlere sahip bir yapıya sahibim (gelecekte birden çok örneğe ihtiyacım olabileceğinden henüz bir singleton sınıfı kullanmadım, ancak şu anda sadece bu tek örneğe sahibim).

Her statik değişkene varsayılan bir değer atanır, ancak bu değerler uygulamanın ömrü boyunca değiştirilir. Bu değişiklikleri userdefaults'ta da saklıyorum, böylece çağrılar arasında kalıcı olacaklar, ancak yine de bu statik değişkenleri kullanıyorum çünkü her seferinde userdefaults'tan okumak istemiyorum.

Şimdi tüm bu değerleri orijinal varsayılan değerlerine sıfırlama seçeneğini istiyorum ve bunu nasıl doğru yapacağımı anlayamıyorum. Varsayılan değerleri tutacak ayrı bir yapı kullanabilir ve değerleri birinden diğerindeki ilgili değişkene değiştirmek için bir işlev kullanabilirim. Ama o kadar zarif görünmüyor ve bunu yapmak için kaçırdığım daha güzel bir yol olmalı.

Aşağıdakileri yapan yapının içine bir func eklemeye çalıştım:

func resetDefaults() {
    self = DefaultStruct()
}

Derleyici bana kendimi değiştiremeyeceğimi ve işlevi mutasyona uğratmam gerektiğini söyledi. Ben de öyle yaptım. Ama sonra kodumun başka bir yerinde, başka bir sınıfta, bu işlev artık kapsamda değil. Eğer eklersem:

DefaultStruct.resetDefaults()

Bana başka hatalar veriyor, örneğin:

Instance member 'resetDefaults' cannot be used on type 'DefaultStruct'; did you mean to use a value of this type instead?

Ayrıca, bu yapının statik değişkenlerini doğrudan kullandığım için, bu yapıyı hiçbir zaman başlatmadım. Başka bir deyişle, başka bir yere erişebileceğim bir yapıya sahip değilim. Ya da belki burada yanılıyorum ve bir şey mi kaçırıyorum???

Yardımınız çok takdir edilecektir. Ya çok temel bir şeyi kaçırıyorum ya da daha önce söylediğim gibi varsayılan değerlerle ayrı bir yapı kullanacağım.

Teşekkürler!

default-value static swift
2021-11-23 19:03:17
1

En iyi cevabı

1

Kavramı gösteren çok önemsiz bir örnek olarak

struct Foo {
   private enum Defaults {
     static let barDefault = "Initial String"
   }
   
   static var bar: String = Defaults.barDefault
   
   static func reset() {
      bar = Defaults.barDefault
   }
   
}
    
print(Foo.bar)  //Initial String

Foo.bar = "New String"
print(Foo.bar)  // New String

Foo.reset()
print(Foo.bar)  // Initial String

Bu, varsayılan dizeleri tutmak için özel bir enum kullanır, böylece (a) diğer statik öznitelikler tarafından kullanılsa bile yapıya inernal kalır ve (b) yanlışlıkla örneklenememesi için.

Değişken için daha karmaşık bir türünüz varsa, varsayılan değeri intial / reset değeri olan bir başlatıcı kullanın, böylece böyle bir şey yapabilirsiniz:

struct Foo {
   struct ComplexStruct{
       var x: SomeType

       init(x: SomeType = DefaultValue) { self.x = x }
   }

   static var bar = ComplexStruct()
   
   static func reset() {
      bar = ComplexStruct()
   }
}
2021-11-24 00:38:42

teşekkür için senin yanıt. 1. Bölümde, değişken bildiriminde bir kez ve reset() işlevinde bir kez olmak üzere iki kez "İlk Dize" ye sahip olursunuz. Tam olarak kaçınmak istediğim şey buydu, sanki bazı varsayılan değerleri değiştirmem gerekecek gibi, bunu her zaman 2 yerde yapmayı hatırlamam gerekecek ve bu hatalara neden oluyor. Sadece bir kez daha zarif bir şekilde tanımlamanın bir yolu olacağını umuyordum. 2. yarıya gelince, deneyeceğim ve geri döneceğim. Tekrar teşekkürler. Bu çok yardımcı oldu!
rafi

@rafi Muhtemelen ilk kısmı çok önemsiz hale getirdim. Bunu çözmek için cevabı yeni güncelledim.
flanker

bu güncelleme için tekrar teşekkürler! İlk bölüm şimdi yapmam gerektiğini düşündüğüm şeye benziyor, ancak bir enum kullanma ve bu varsayılan değerleri aynı yapının içine koyma öneriniz mükemmel! Bu değişkenleri bildirirken ve değerlerini sıfırlarken aynı şeyi yaptığımızdan, bu kodu sadece bir kez yazabileceğimizi umuyordum ve sonra belki de reset() işlevini çağıracak bir başlatıcıya sahip olabilirdik, ancak başarılı olamadım. çalışmasını sağlamak için tam olarak önerdiğiniz şeyi yaptım ve şimdi mükemmel çalışıyor. Tekrar teşekkürler!
rafi

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................