2016-09-14 7 views
1

私はこのように設定されている列挙型を持っている:エラーが

私の考えは、私は特定の計算に続いて、私が欲しい電卓のカテゴリーに通過し、それが返されるということです
enum Calculators { 

    case RECTANGLE 
    case CIRCLE 
    case TRIANGLE 
    case TRAPEZOID 
    case CUBE 
    case CONE 
    case SPHERE 
    case CYLINDER 
    case ASPHALT 
    case TACK_SEAL_COAT 
    case ASPHALT_YIELD 
    case SIDEWALK 
    case CONCRETE_DECK_SEALER 
    case CHIP_SEAL 
    case AGGREGATE_STOCK_PILE 
    case BACKFILL 
    case SALT_STOCK_PILE 
    case SALT_SPREADER_CALIBRATION 
    case ROAD_SALT_APPLICATION 

    static let groups = [[RECTANGLE, CIRCLE, TRIANGLE, TRAPEZOID], 
         [CUBE, CONE, SPHERE, CYLINDER], 
         [ASPHALT, TACK_SEAL_COAT, ASPHALT_YIELD, SIDEWALK, CONCRETE_DECK_SEALER, CHIP_SEAL, AGGREGATE_STOCK_PILE, BACKFILL], 
         [SALT_STOCK_PILE, SALT_SPREADER_CALIBRATION, ROAD_SALT_APPLICATION]] 

    func getCalculator(category: Int, row: Int) -> Calculators { 
     if let calculator = Calculators.groups[category][row] { 
      return calculator 
     } else { 
      return Calculators.UNDEFINED 
     } 
    } 
} 

正しい列挙型は、TableViewでどの行が選択されたかに基づいています。

問題は、私は混乱するエラーに直面しているということです。この最初のエラーはif let calculator行にあります。エラーはEnum case 'Some' not found in type 'Calculators'と表示されます。なぜそれがこれを探しているのか分かりません。

このエラーは何を意味し、どのように私はそれをやり直すことができますか?

+1

FYI、スウィフト3列挙型のケースになりました下キャメルケースでなければなりませんhttps://swift.org/documentation/api-design-guidelines/#conventions、参照するときにも、内、例の前にドットが必要enum:https://github.com/apple/swift-evolution/blob/master/proposals/0036-enum-dot.md – PeejWeej

答えて

1

いくつ 1.あなたはまた、ためにCalculators.getCalculator

ようにそれにアクセスするための静的メソッドとしてgetCalculatorを宣言することができます例1 2としてUNDEFINED追加しますインデックスが範囲外のときにプログラムがクラッシュするのを防ぐために、私はUNDEFINEDを返すチェックを追加しました。

enum Calculators { 
    case RECTANGLE 
    case CIRCLE 
    case TRIANGLE 
    case TRAPEZOID 
    case CUBE 
    case CONE 
    case SPHERE 
    case CYLINDER 
    case ASPHALT 
    case TACK_SEAL_COAT 
    case ASPHALT_YIELD 
    case SIDEWALK 
    case CONCRETE_DECK_SEALER 
    case CHIP_SEAL 
    case AGGREGATE_STOCK_PILE 
    case BACKFILL 
    case SALT_STOCK_PILE 
    case SALT_SPREADER_CALIBRATION 
    case ROAD_SALT_APPLICATION 
    case UNDEFINED 

    static let groups = [[RECTANGLE, CIRCLE, TRIANGLE, TRAPEZOID], 
        [CUBE, CONE, SPHERE, CYLINDER], 
        [ASPHALT, TACK_SEAL_COAT, ASPHALT_YIELD, SIDEWALK, CONCRETE_DECK_SEALER, CHIP_SEAL, AGGREGATE_STOCK_PILE, BACKFILL], 
        [SALT_STOCK_PILE, SALT_SPREADER_CALIBRATION, ROAD_SALT_APPLICATION]] 

func getCalculator(category: Int, row: Int) -> Calculators { 
    if Calculators.groups.indices.contains(category) { 
     let calculators = Calculators.groups[category] 

     if calculators.indices.contains(row) { 
      return calculators[row] 
     } 

    } 
    return Calculators.UNDEFINED 
} 
} 

let testCalculator = Calculators.RECTANGLE 
testCalculator.getCalculator(category: 7, row: 1) // Result: UNDEFINED 
testCalculator.getCalculator(category: 1, row: 1) // Result: CONE 
+0

コードを使用したサンプルを追加することはできますか? – Honey

1

if letは、オプション(必須)を評価しません。範囲外の場合、配列添字はクラッシュします。私はあなたが何を意味するのかと思う:

func getCalculator(category: Int, row: Int) -> Calculators? { 
    let groups = Calculators.groups 
    guard groups.indices.contains(category) else { return nil } 
    let calculatorCateogry = groups[category] 
    guard calculatorCateogry.indices.contains(row) else { return nil } 
    return calculatorCateogry[row] 
}