Konvertieren zwischen einzigartigen NSIndexPath und einzigartigen NSUInteger (oder int)
-
13-09-2019 - |
Frage
Gibt es einen besseren Weg, als das, was hier vorgeschlagen, eine eins-zu-eins-Abbildung zwischen einer Tabellenansicht Zelle NSIndexPath
und einem einzigartigen NSUInteger
oder int
zu schaffen, um einen einzigartigen tag
Eigenschaftswert für ein Widget in der Zelle zu erstellen (a UIProgressView
)?
Der Link fügt Methoden durch eine UIKit
Kategorie-Erweiterung, die zwischen NSIndexPath
und int
konvertiert, aber sie nur für weniger Arbeit als eine bestimmte Anzahl von Zeilen.
Zugegeben, kann ich nicht in diese Grenze laufen, aber ich frage mich, ob es eine Abbildung ist, dass jemand mit, dass für eine beliebige Anzahl von Zeilen arbeiten garantiert kann gekommen ist werden.
Lösung
Nein, es ist nicht wirklich eine Art und Weise, die garantiert für eine beliebige Anzahl von Zeilen zu arbeiten. Wenn Sie eine Tabelle mit zwei Abschnitten, die jeweils mit 3 Milliarden Zeilen, dann gibt es keine Möglichkeit, diese 6 Milliarden Potenzial NSIndexPaths in die 4 Mrd. 32-Bit-NSIntegers abzubilden.
(wenn Sie ein 64-Bit-App erstellt wird, die gleiche Sache ist wahr, aber die Zahlen würden weitere 4 Milliarden Mal größer im Beispiel sein müssen.)
Sie verwenden eine Grenze von 10.000 Zeilen pro Abschnitt im Beispiel Sie verknüpfen; wenn Sie ernsthaft besorgt sind, könnten Sie mehr Zeilen als das haben, könnten Sie eine größere Konstante verwenden, das heißt Sie 1.000.000 als die maximale Anzahl von Zeilen verwenden können, wenn Sie wissen, dass Sie nicht mehr als 4.000 Abschnitte haben.
Beachten Sie, dass ein „echter Programmierer“ vermutlich 65536 als Konstante, natürlich verwenden würde.
Andere Tipps
Wenn ich eine Notwendigkeit, dies zu tun, würde ich einfach den Abschnitt Pfad verschieben, um eine Hälfte eines 32-Bit-int, und verschieben Sie die Zeile Teil zum anderen. Ja, das bedeutet, dass Sie nicht mehr als 65.535 Elemente in einer Reihe haben kann (darin Ausbrechen ich unsigned ints angenommen, da Zeile / Abschnitt wird nie negativ sein), aber ich werde eine angenommene Grenze nehmen weit größer, als ich jemals brauchen werden, über ein magischer konstante jeden Tag möglich.
Außerdem ist es billige rechen.
In der Regel in dieser Situation, obwohl ich meinen Tabelle View-Controller als Delegierter für jede Zelle, und die Zelle einrichten kann zusammen mit einigem Schlüsselwert mit Änderungen die Steuerung zurückrufen verwendet, um die Zelle zu schaffen - schließlich, wenn Sie bevölkern eine Zelle, die Sie wissen, wie in Ihre Daten ziehen Werte zu erreichen. Heck, Sie könnte sogar einfach speichern die IndexPath in die Zelle, und es kann mit dem zurückrufen. Der Grund, warum ich nicht die IndexPath Ansatz oder die vor einer Verwendung würde NSIndexPath in ein Tag beteiligt Abflachung ist, dass, wenn Sie jemals Reihen beginnen dynamisch ändern sich die Werte zwischen dem NSndexPath erstellt man eine Zelle mit und den Wert für den aktuellen Datensatz nicht ausgerichtet werden könnte. Viel besser eine Art Schlüssel zu haben, die Sie immer wieder zurück auf die richtigen Daten logisch bekommen.