Es gibt einige gute Antworten auf diese Frage, aber die meisten von ihnen gemeinsam eine schlechte Sache haben, sie zwingen ungeöffneten optionals, die Sie so viel vermeiden sollten, wie Sie können (so ziemlich das einzig akzeptable Ort, um sie zu verwenden ist in IBOutlets)
Dies ist der beste Weg, dies zu handhaben, was ich denke, ist:
ich
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCellWithIdentifier("Identifier", forIndexPath: indexPath) as? FormItemTableViewCell else {
fatalError("Cell is not of kind FormItemTableViewCell")
}
switch cell {
case let cell as TwoOptionTableViewCell where indexPath.row == 1:
// Configure cell, which is an object of class TwoOptionTableViewCell, but only when we are in row 1
break
case let cell as TwoOptionTableViewCell:
// Configure cell, which is an object of class TwoOptionTableViewCell, when the row is anything but 1
break
case let cell as OneTextFieldTableViewCell:
// Configure cell, which is an object of class OneTextFieldTableViewCell
break
case _: print("The cell \(cell) didn't match any patterns: \(indexPath)")
}
cell.questionLabel.text = "What is the meaning of life?";
return cell
}
Jetzt gehen Sie, ich denke, es ist der beste Weg, durch die Gründe lassen.
Zunächst einmal, es nicht zwingt, alle Optionals auszupacken, alles ist schön im switch
Fall ausgepackt.
Es entfernt Ihre Zelle aus der Tabelle (etwas, was Sie immer tun sollten) und stellt sicher, dass es eine Unterklasse von FormItemTableViewCell
ist, andernfalls wird ein schwerwiegender Fehler ausgegeben.
Wenn Sie einen Switch-Fall verwenden, wird cell
in die von Ihnen benötigte Klasse umgewandelt. Gleichzeitig wird überprüft, ob es sich um den gewünschten Indexpfad handelt. Wenn Sie also eine Logik in verschiedenen Zeilen teilen möchten, die eine Klasse teilen, können Sie indexPath.row
mit mehreren Werten vergleichen. Wenn Sie die where
-Klausel nicht verwenden, wird dieselbe Logik an allen Stellen verwendet, an denen eine Zelle mit dieser Klasse gefunden wird.
Beachten Sie, dass Sie einige Logik hinzufügen müssen, um den gewünschten Bezeichner abhängig von der Zeile zu erhalten.
Ich mag die Switch-Anweisung Methode +1. Ist etwas falsch mit der Kraftauswicklung, wenn die Zelle aus der Warteschlange genommen wird? Ich sehe, dass Apples Dokumentation auch Kraftentfaltung ist. https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson7.html – Alan
Force ausgepackte Optionals sollen eine letzte Möglichkeit sein, weil sie die Sicherheitskontrollen von Swift außer Kraft setzen (was einer davon ist) größten Funktionen) und kann Ihre App zum Absturz bringen, wenn Sie es nicht erwarten. In diesem Fall benutze ich 'fatalError', was auch deine App stürzt, aber es wird kontrolliert verwendet. Wenn du diesen Absturz siehst, weißt du, wo er herkommt und warum. – EmilioPelaez