2017-10-19 85 views
0

我想用元素數組填充UITableView。這些元素是結構:訪問結構內的枚舉

public enum itemNumber { 
    case Item1 
    case Item2 
    case Item3 
    case Item4 
    case Item5 
    case Item6 
} 

public enum sectionNumber { 
    case Section1 
    case Section2 
    case Section3 
    case Section4 
} 

public struct Item { 
    var itemNumber: itemNumber? 
    var sectionNumber: sectionNumber? 
    var checkmark: Bool 

    init(sectionNumber: Int, itemNumber: Int, checkmark: Bool) { 
    switch sectionNumber { 
    case 0: self.sectionNumber = .Section1 
    case 1: self.sectionNumber = .Section2 
    case 2: self.sectionNumber = .Section3 
    case 3: self.sectionNumber = .Section4 
    default: break 
    } 
    switch itemNumber { 
    case 0: self.itemNumber = .Item1 
    case 1: self.itemNumber = .Item2 
    case 2: self.itemNumber = .Item3 
    case 3: self.itemNumber = .Item4 
    case 4: self.itemNumber = .Item5 
    case 5: self.itemNumber = .Item6 
    default: break 
    } 
    self.checkmark = checkmark 
    } 
} 

在我的控制器類我要檢查每個Item的部分號,以便將其分配給適當的部分:

func getNumOfItemsPerSection(section: Int) -> Int { 
    var num = 0 
    switch section { 
    case 0: num = self.items.filter { $0.sectionNumber == .Section1 }.count 
    case 1: num = self.items.filter { $0.sectionNumber == .Section2 }.count 
    case 2: num = self.items.filter { $0.sectionNumber == .Section3 }.count 
    case 3: num = self.items.filter { $0.sectionNumber == .Section4 }.count 
    default: break 
    } 
    return num 
    } 

此方法不編譯: 二元運算符'=='不能應用於類型'sectionNumber?'的操作數和'_'

這樣做的正確方法是什麼? 謝謝!

+7

請,請與起始大寫字母('ItemNumber','SectionNumber宣佈你的枚舉')和小寫的情況,否則整個代碼讀起來非常混亂。錯誤的原因是枚舉變量是可選項。由於枚舉總是有固定數量的情況,通常包含枚舉的變量應該是非可選的 – vadian

+0

還有很多東西需要學習...不知道這個命名約定。獎勵! – gmoraleda

回答

1

有幾個問題與您的代碼:

  1. 它打破了斯威夫特的命名約定。類型(包括枚舉)應以大寫字母(ItemNumber)命名。屬性(例如枚舉個案)應爲小寫(item1
  2. 枚舉個案可以表示「原始」值,例如IntString。你的代碼有很多switch語句將一個枚舉與一個整數相匹配 - 你不需要這樣做。

這是我會怎麼重寫代碼:

public enum ItemNumber: Int { 
    case item1 // item1 is implicitly 0 
    case item2 
    case item3 
    case item4 
    case item5 
    case item6 
} 

public enum SectionNumber: Int { 
    case section1 = 0 // section1 is explicitly 0. You can start at any value. 
    case section2 
    case section3 
    case section4 
} 

public struct Item { 
    var itemNumber: ItemNumber? 
    var sectionNumber: SectionNumber? 
    var checkmark: Bool 

    init(sectionNumber: Int, itemNumber: Int, checkmark: Bool) { 
     self.itemNumber = ItemNumber(rawValue: itemNumber) 
     self.sectionNumber = SectionNumber(rawValue: sectionNumber) 
     self.checkmark = checkmark 
    } 
} 

而且你的控制器的功能:

func getNumOfItemsPerSection(section: Int) -> Int { 
    guard let sectionNumber = SectionNumber(rawValue: section) else { return 0 } 
    return self.items.filter({ $0.sectionNumber == sectionNumber }).count 
} 
+0

更簡單,更清潔,更好... 非常感謝! – gmoraleda

+0

我還有一個問題:如何爲'ItemNumber'和'SectionNumber'設置默認/回退情況?使用'switch'語句非常簡單 - >'default:',但現在我不確定... 再次感謝! – gmoraleda

+0

看到'guard let'聲明?你就是這麼做的 –