Ergebnis einer Funktion aus einem Struct in View verwenden unter SwiftUI

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ergebnis einer Funktion aus einem Struct in View verwenden unter SwiftUI

    Habe jetzt schon einiges an Videos und Tutorials zu SwiftUI gelesen und durchgearbeitet, allerdings stehe ich nun vor einem Problem und hoffe, dass ihr mit helfen könnte.

    Ich möchte Berechnungen in einem eigenen Struct durchführen lassen und nur das Ergebnis in meiner View ausgeben.

    Dafür habe ich zwei Möglichkeiten, weis allerdings nicht welche der richtige Lösungsweg ist. Vielleicht kann mir jemand von Euch helfen.

    Welcher Code wäre der richtige?

    Quellcode

    1. import SwiftUI
    2. let berechnung = Berechnungen()
    3. let result1 = berechnung.addition(value1: 20, value2: 10)
    4. struct ContentView: View {
    5. var body: some View {
    6. Text("Summe: \(result1)")
    7. }
    8. }
    9. struct ContentView_Previews: PreviewProvider {
    10. static var previews: some View {
    11. ContentView()
    12. }
    13. }
    Alles anzeigen

    Quellcode

    1. import SwiftUI
    2. struct ContentView: View {
    3. let berechnungen = Berechnungen()
    4. let result1: Int
    5. init() {
    6. result1 = berechnungen.division(value1: 10, value2: 5 )
    7. }
    8. var body: some View {
    9. Text("Summe: \(result1)")
    10. }
    11. }
    12. struct ContentView_Previews: PreviewProvider {
    13. static var previews: some View {
    14. ContentView()
    15. }
    16. }
    Alles anzeigen

    Zum Ziel führt beides, nur bin ich mir unsicher, ob beide Varianten "richtig" oder es dadurch später zu Komplikationen kommen kann.
    Welches Thema sollte ich mir evtl. nochmals genauer anschauen.
  • Hallo,

    von den beiden Code Snippets würde ich definitiv den zweiten präferieren, da du im ersten deine Variablen im globalen scope definierst (d.h. du könntest von überall darauf zugreifen). Das führt meistens nur zu Verwirrung, code bloat und unleserlichen Code. Und zudem ist es ganz einfach gar nicht notwendig, da es lediglich innerhalb der ContentView benötigt wird. Grundsätzlich musst du dir natürlich überlegen, ob sich für deine Berechnung ein eigenes Struct überhaupt rentiert (ist diese so komplex bzw. reusable?).

    VG
  • Also ich würde es eher so machen, damit du das Ergebnis auch später noch ändern kannst:

    C-Quellcode

    1. import SwiftUI
    2. struct ContentView: View {
    3. @State var result: Int = 0
    4. var body: some View {
    5. HStack {
    6. Text("Summe: \(result)")
    7. }
    8. .onAppear() {
    9. let berechnung = Berechnungen()
    10. result = berechnungen.division(value1: 10, value2: 5)
    11. }
    12. }
    13. }
    Alles anzeigen

    Wenn du Berechnung häufiger brauchst, dann könntest du es auch anfangs gleich als @EnvironmentObject mitgeben und kannst es dann in allen Views nutzen.
    So Long, and Thanks for All the Fish.
  • Ok, das hatte ich jetzt eher auf die Struct der View bezogen aber kann schon sein, dass er Berechnung wirklich als Struct implementiert hat. Warum wäre in diesen beiden konkreten Beispielen aber eine Struct ungeeignet? In beiden Beispielen wäre es für mich vollkommen egal, ob das eine Klasse oder Struct ist.

    Ein Unterschied würde es doch erst geben, wenn er das Objekt weiterverwendet/-gibt. Dort wäre dann IMO ein EnvironmentObject sinnvoll, was sowieso eine Klasse benötigt. Ob der Fragesteller das aber benötigt, geht jetzt nicht direkt aus der Frage hervor.
    So Long, and Thanks for All the Fish.
  • Würde ich so nicht sagen, ein struct wird beispielsweise bei jeden Update der View neu erstellt. Wenn Dir das egal ist, und du es auch nicht weiterreichen möchtest, kannst du gerne ein struct verwenden. Das heisst halt, im Init, darfst du keine aufwendigen Implementierungen haben, sonst geht es schnell zulasten der performance.

    EnvironmentObjects, würde ich nur einsetzen, wenn sie wirklich global gelten und jede View auf den gleichen State zugreifen soll/muss.
  • Wolf schrieb:

    Würde ich so nicht sagen, ein struct wird beispielsweise bei jeden Update der View neu erstellt. Wenn Dir das egal ist, und du es auch nicht weiterreichen möchtest, kannst du gerne ein struct verwenden. Das heisst halt, im Init, darfst du keine aufwendigen Implementierungen haben, sonst geht es schnell zulasten der performance.

    EnvironmentObjects, würde ich nur einsetzen, wenn sie wirklich global gelten und jede View auf den gleichen State zugreifen soll/muss.
    In dem Beispiel von mir wird eine Klasse genauso bei jedem Aufruf der View neu erzeugt wie eine Struct. Da gibt es keinen Unterschied zwischen Klasse und Struct, da beide „Objekte“ onAppear nicht überleben.

    Ohne weitere Informationen, was da eigentlich gemacht werden soll, kann man hier keine seriösen Empfehlungen zur Implementierung geben. Sofern Berechnungen() irgendwie weitergegeben werden soll, ist eine Klasse natürlich die beste Wahl. Wenn die Methode aber nur an einer einzigen Stelle benötigt wird, geht auch genauso gut eine Struct.
    So Long, and Thanks for All the Fish.
  • In SwiftUI ist das sicher kein Nonsens, auch wenn es je nach Anwendungsfall – den ich nicht kenne – nicht die beste und schon gar nicht die einzige Lösung sein muss. Und es bleibt dabei, dass es bei allen Beispielen hier im Thread keinen Unterschied zwischen struct und class macht.
    So Long, and Thanks for All the Fish.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Babelfisch ()