2016-05-09 7 views
0

Ich hasse es, dies zu veröffentlichen, weil es wie grundlegende Swift scheint, jedoch kann ich keinen Weg finden, diese optionale unwrapped bekommen und ich habe eine Idee, dass es mit der Art und Weise NSUserDefaults sein kann Speichern, aber ich bin mir nicht sicher.Kann nicht auspacken Optional beim Auffüllen der Zelle

ich eine [Zeichenfolge] speicherte als so:

NSUserDefaults.standardUserDefaults().setObject(infectedNamesArray, forKey: "infectedNamesArray") 

und es so unter Hinweis:

if let infected = NSUserDefaults.standardUserDefaults().objectForKey("infectedNamesArray") 
    { 
     infectedNamesArray = infected as! [String] 
    } 

ich das Array bin mit einer wieder verwendbaren Zelle so füllen:

switch whichScoreSet 
    { 
    case 0: 
     cell.nameLabel.text = "Test" 
     cell.scoreLabel.text = "Test" 
    case 1: 
     cell.nameLabel.text = infectedNamesArray[indexPath.row] 
     cell.scoreLabel.text = "\(infectedGameScoreTotals["\(infectedNamesArray[indexPath.row])"]!)" 
    case 2: 
     cell.nameLabel.text = "Test" 
     cell.scoreLabel.text = "Test" 
    default: 
     print("Something Went Wrong") 
    } 

Alles funktioniert gut, ich kann zwischen Tabellendaten und Ladeansichten wechseln. Wenn die Daten aus cell.nameLabel.text angezeigt werden, wird die Option optional angezeigt. d. h. optional (valueFromArray)

Ich habe versucht, es auszupacken, und Xcode sagt mir, dass ich eine Zeichenfolge nicht auspacken kann. Ich habe versucht, es als eine Zeichenfolge zu werfen und Xcode sagt mir, dass es keinen Unterschied machen würde, weil es bereits eine Zeichenfolge ist.

Ich bin auf diesem grundlegenden Swift ratlos, also bitte vergib die Frage. Techniken aus vielen anderen SO-Posts liefern die gleichen Ergebnisse.

Was übersehe ich hier?

EDITED

Die Variable wird außerhalb einer Klasse, die als solche erklärt.

var infectedNamesArray = [String]() 
+0

Es hängt davon ab, wie 'infictedNamesArray' deklariert wird. Wenn Sie es als nicht-optionalen leeren Array deklarieren 'var infizierteNamesArray = [String]()' alles wird gut. – vadian

+0

@vadian Das ist, wie ich es erklärt habe, weshalb ich für eine Schleife geworfen werde. –

+0

Wo ist 'inficedNamesArray' definiert? Kannst du diesen Code posten? –

Antwort

1

infectedNamesArray[indexPath.row] soll, sicher sein, so dass Sie es direkt und ist optional, fehlt kann

let infectedName = infectedNamesArray[indexPath.row] 
cell.nameLabel.text = infectedName 

der Wert für die Schlüssel infectedName in infectedGameScoreTotals verwenden können, so versuchen

let scoreTotal = infectedGameScoreTotals[infectedName] 
cell.scoreLabel.text = scoreTotal != nil ? "\(scoreTotal!)" : "n/a" 

n/a ist ein Platzhalter angezeigt werden, falls der Wörterbuchschlüssel nicht verfügbar ist.

+0

Ich habe es gerade versucht, alles wird noch angezeigt, aber ich bekomme immer noch das optionale im Display. Randnotiz, vielen Dank für die viel bessere Möglichkeit, den Wörterbuchwert anzuzeigen. –

+0

Dann scheint das Wörterbuch 'infizierteGameScoreTotals' selbst optional zu sein. Probieren Sie "infizierteSpielergebnisseTotale! [InfizierteName]" aus oder verwenden Sie die optionale Bindung. – vadian

+0

Das Wörterbuch wurde richtig angezeigt, der [String] war der, mit dem ich Probleme hatte. –

1

Versuchen Sie, diese

switch whichScoreSet 
    { 
    case 0: 
     cell.nameLabel.text = "Test" 
     cell.scoreLabel.text = "Test" 
    case 1: 
    if let nameString = infectedNamesArray[indexPath.row] as? String { 
     cell.nameLabel.text = nameString 
     cell.scoreLabel.text = "\(infectedGameScoreTotals["\(nameString)"]!)" 
    } 
    case 2: 
     cell.nameLabel.text = "Test" 
     cell.scoreLabel.text = "Test" 
    default: 
     print("Something Went Wrong") 
    } 
+0

Dies lieferte die gleichen Ergebnisse, die ich hatte. Nichts hat sich geändert. Ich bekomme auch die Warnung, dass eine bedingte Umwandlung von String zu String immer erfolgreich ist. –

+0

Versuchen Sie, "?" mit "!" –

+0

wenn ich die ersetzen? mit! gibt es mir einen roten Fehler, der besagt, dass es einen optionalen Typ und keinen String-Typ haben muss. –

0

Sie könnten versuchen, die Null Koaleszenz-Operator und einen Standardwert, wie das Bereitstellen:

case 1: 
    cell.nameLabel.text = infectedNamesArray[indexPath.row] ?? "Some Default String" 

, die funktionieren sollte das optionale infectedNamesArray[indexPath.row] und wenn auszupacken Es ist nil, ersetzen Sie die Standardeinstellung String.

+0

Das änderte auch nichts. Ich bekomme immer noch ein optionales wenn angezeigt. –

Verwandte Themen