for-in Loop Problem

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

  • for-in Loop Problem

    Hallo,

    Ich habe das Problem das einer meine Variable test immer nur den letzten aller Werte behält was ich nicht ganz nachvollziehen kann aber hier der Code...

    Quellcode

    1. var test: Int = Int()

    Quellcode

    1. let library = [1, 2, 3, 4, 5]
    2. for books in library {
    3. let prozentVonGesamt = books * 100 / gesamt
    4. test = prozentVonGesamt * Int(superBar[0].frame.size.width) / 100
    5. for widths in widthSubBar {
    6. widths.constant = CGFloat(test)
    7. }
    8. }
    Was mache ich falsch ? Habe jetzt schon mehrere Sachen mit test ausprobiert doch bin eigentlich der Meinung das die Variable so aussehen müsste.
  • Deine Variable test ist ein Integer, der in jedem Durchlauf des for-Loops einen neuen Wert zugewiesen bekommt. Der Stand des Durchlaufs, indem books den Wert 5 annimmt, ist der letzte und demnach der, der für die außerhalb deklarierte Variable test nach dem Loop erhalten bleibt.

    Ehrlich gesagt verstehe ich nicht genau was du vorhast, vielleicht stehe ich auch auf dem Schlauch, aber eventuell hilft es zu erklären, was du von der Variable test erwartet hättest.
  • Mmh okay ja so was habe ich mir auch schon gedacht aber natürlich kann ich das erklären was ich von test will :D
    Für jeden Wert in Library nimmt test ja einen Wert an wie du schon richtig erkannt hast. Jetzt möchte ich aber das die widths.constant auch jeden der Werte widerspiegelt die test angenommen hat.

    Aktuell ist es ja nur die letzte Zahl.

    Hintergrund ist der das es nämlich fünf Werte in widthSubBar gibt und jeder von denen soll von oben nach unten einen der fünf Werte aus test annehmen. Also bspw. die erste widths.constant soll den Wert von test bekommen der mit Library 1 zusammenpasst, der nächste dann mit library 2 usw.

    Ich habe auch schon probiert die Werte die test annimmt in ein neues array zu packen aber das will auch nicht funktionieren....
  • Die Lösung von torquato sieht schön effizient aus.

    In deinem ursprünglichen Ansatz hast du die for-Loops verschachtelt, sodass in jedem Durchlauf jeweils alls 5 widths gesetzt werden, nur um dann im nächsten Durchlauf wieder von 5 neuen Werten überschrieben zu werden (bis eben beim letzten Durchlauf, die dort geschriebenen Werte bleiben bestehen, was du ja auch genau als dein Problem beschrieben hast).

    Wie gesagt, die Lösung von torquato ist sicherlich aus Performance-Gründen vorzuziehen, aber nur zum Verständnis:
    anstelle eines zweiten for-Loops müsstest du deinen test Wert einfach der i-ten Position von widthSubBar zuweisen. Da books ein Integer ist, würde vermutlich:


    Quellcode

    1. widthSubBar[books].constant = CGFloat(test)
    funktionieren.
  • Tazaki schrieb:

    Da books ein Integer ist, würde vermutlich:

    Quellcode

    1. widthSubBar[books].constant = CGFloat(test)
    funktionieren.

    Wenn wir den Ausgangscode des Thread-Eröffners zugrunde legen, dann sicherlich nicht. Das Array library fängt bei 1 an. ;)
    Außerdem ist nicht bekannt, ob es sich bei widthSubBar nicht um ein Array-Slice handelt. Dann könnte man nicht mit Sicherheit sagen, was der Basis-Index ist. Ich empfehle immer die Indices der Collection zu verwenden, statt von außen kommende und vermutete Werte.

    Zur Performance: Wenn wifthSubBar eine RandomAccessCollection ist, ist das Subscript O(1), also genau so gut wie die zip-Variante. Wenn das aber 'nur' eine Collection oder BidirectionalCollection ist, ist das mit einem Subscript letztendlich genau so schlecht wie zwei Loops.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?