So wie ich diese gleiche Art von Situation in einer aktuellen App behandelt war ein Struct zu verwenden ausschließlich aus statischen aus Mitglieder, anstatt einer Enum - zum Teil, weil ich mehr Informationen hatte, um mit jeder Option zu verbinden, zum Teil, weil ich es satt hatte, toRaw()
und fromRaw()
everyplace zu nennen, und teilweise, weil (wie Ihr Beispiel zeigt, dass Sie entdeckt haben) Enum verliert seinen Vorteil, wenn sich herausstellt, dass Sie nicht durchgehen oder eine vollständige Liste der Fälle erhalten können.
Also, was ich tat, war dies:
struct Sizes {
static let Easy = "Easy"
static let Normal = "Normal"
static let Hard = "Hard"
static func sizes() -> [String] {
return [Easy, Normal, Hard]
}
static func boardSize (s:String) -> (Int,Int) {
let d = [
Easy:(12,7),
Normal:(14,8),
Hard:(16,9)
]
return d[s]!
}
}
struct Styles {
static let Animals = "Animals"
static let Snacks = "Snacks"
static func styles() -> [String] {
return [Animals, Snacks]
}
static func pieces (s:String) -> (Int,Int) {
let d = [
Animals:(11,110),
Snacks:(21,210)
]
return d[s]!
}
}
Wenn wir jetzt zu cellForRowAtIndexPath
bekommen kann ich so reden:
let section = indexPath.section
let row = indexPath.row
switch section {
case 0:
cell.textLabel.text = Sizes.sizes()[row]
case 1:
cell.textLabel.text = Styles.styles()[row]
default:
cell.textLabel.text = "" // throwaway
}
Im Wesentlichen habe ich verwendet, nur die beiden Structs als Namensräume mit einige zusätzliche Intelligenz. Ich sage nicht, dass das besser ist als das, was du tust; sie sind beide sehr Swifty. Es ist nur eine andere Idee zu berücksichtigen.
Die einfache Antwort ist, versuchen Sie nicht, über den Typ zu lügen; indexPath.row ist ein Int, kein Cat. Aber lass dich nicht davon abhalten; was du tust, ist extrem Swifty und du solltest weiter diesen Weg gehen. Sehr schön. – matt