2017-06-05 4 views
1

Ich habe eine Klasse namens HTTPHelper, die für alle meine Back-End-API-Anfragen verantwortlich ist. Alle Methoden in dieser Klasse sind class Methoden. Wie Sie wissen, können Instanzeigenschaften nicht innerhalb einer class Methode verwendet werden. Ich habe einige Eigenschaften, die Initialisierung mit einem do{}catch{} Block müssen die derzeit aus wie so innerhalb eines init(){} eingeleitet werden:Wie initiiere ich ein Singleton in Swift?

class HTTPHelper{ 
    init(){ 
     do { 
      //initiate property 
     } catch{} 
    } 
} 

Meine Frage ist, gibt es einen Mechanismus ähnlich einer init(){}, die eine statische Eigenschaft für eine eingeleitet würde Singleton?

+0

Ich würde vorschlagen, einen Standard-Implementierung Singleton (https://stackoverflow.com/ Fragen/26742138/Singleton-in-Swift/26743597 # 26743597), machen Ihre Eigenschaften normale Instanz Eigenschaften des Singleton. – Rob

+0

Also was passiert im Grunde ist, Sie definieren nur eine Klasse "regelmäßig" ohne "Klasse" Methoden oder "statische" Eigenschaften und erstellen Sie einfach eine statische Instanz der genannten Klasse? @Rob –

+0

Ja. Wie [URLSession.shared'] (https://developer.apple.com/reference/foundation/urlsession/1409000-shared) oder ['FileManager.default'] (https://developer.apple.com/reference/ foundmanager/1409234-default) .. – Rob

Antwort

1

Sie können dem Ergebnis eines Abschlusses oder einer Funktion eine Eigenschaft zuweisen (beachten Sie die und () am Ende, um die Schließung auszuführen)). Wenn Sie zum ersten Mal auf die Eigenschaft zugreifen, wird der Wert nur einmal mithilfe Ihrer Funktion/Closure berechnet und dann für zukünftigen Zugriff in der Eigenschaft gespeichert.

class MyClass { 
    static let myProperty: String = { 
     do { 
      return try blah() 
     } catch { 
      // error handling 
     } 
    }() 
} 

Natürlich ist dies nur ein Spezialfall das Ergebnis einer Funktion auf eine Eigenschaft zuweisen:

class MyClass { 
    static let myProperty: String = MyClass.createMyString() 

    static func createMyString() -> String { 
     do { 
      return try blah() 
     } catch { 
      // error handling 
     } 
    } 
} 
+1

_ "Dies ist nicht dasselbe wie eine berechnete Eigenschaft, bei der der Wert jedes Mal neu erstellt wird" _ - tatsächlich; Es ist eher wie eine ** faule ** Eigenschaft. –

+1

Danke Jack für dich Antwort. Wenn Sie Robs Kommentar auch in Ihren Beitrag aufnehmen könnten, damit zukünftige Leser Zugang zu einer umfassenderen Antwort haben, würde ich das sehr begrüßen. –

Verwandte Themen