Sposób, w jaki obsługiwane ten sam rodzaj sytuacji w ostatnim aplikacji było użyć struktury, na które składają się wyłącznie z statyczna członkowie, zamiast Enum - po części dlatego, że miałem więcej informacji do skojarzenia z każdą opcją, po części dlatego, że miałem dość konieczności wywoływania w każdym miejscu każdego z nich, a po części dlatego, że (jak pokazuje twój przykład) Enum traci swoją przewagę, gdy okazuje się, że nie można przejść przez cykl lub uzyskać pełną listę przypadków.
Więc co zrobiłem było tak:
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]!
}
}
Teraz, gdy mamy do cellForRowAtIndexPath
mogę mówić tak:
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
}
Zasadniczo mam tylko używane dwa kodowanym jako nazw z trochę dodatkowej inteligencji. Nie mówię, że to jest lepsze niż to, co robisz; oboje są wybitnie spieniężni. To tylko kolejny pomysł do rozważenia.
Prosta odpowiedź brzmi: nie próbuj kłamać na temat typu; indexPath.row to Int, a nie Cat. Jednak nie pozwól, aby cię zatrzymać; to, co robisz, jest bardzo szybkie i powinieneś iść tą drogą. Bardzo dobrze. – matt