Con đường tôi xử lý loại này tương tự về tình hình trong một ứng dụng gần đây là sử dụng một Struct bao gồm toàn bộ các tĩnh các thành viên, thay vì một Enum - một phần vì tôi có thêm thông tin để liên kết với mỗi tùy chọn, một phần vì tôi bị bệnh phải gọi toRaw()
và fromRaw()
mọi nơi, và một phần vì (như ví dụ của bạn cho thấy bạn đã khám phá) Enum mất lợi thế của nó khi nó chỉ ra rằng bạn không thể chu kỳ thông qua, hoặc có được một danh sách đầy đủ, các trường hợp.
Vì vậy, những gì tôi đã làm được điều này:
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]!
}
}
Bây giờ khi chúng tôi nhận được cellForRowAtIndexPath
Tôi có thể nói chuyện như thế này:
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
}
Về cơ bản tôi đã chỉ được sử dụng hai Struct như không gian tên với một số thông minh bổ sung. Tôi không nói điều này tốt hơn những gì bạn đang làm; cả hai đều nổi tiếng Swifty. Nó chỉ là một ý tưởng khác để xem xét.
Câu trả lời đơn giản là, đừng cố nói dối về loại; indexPath.row là một Int, không phải là một Cat. Tuy nhiên, đừng để điều đó ngăn cản bạn; những gì bạn đang làm là cực kỳ Swifty và bạn nên tiếp tục đi xuống con đường này. Rất đẹp. – matt