使用下标时出错:无法使用索引类型下标type ...的值

时间:2015-05-19 16:48:22

标签: swift

我想在自定义类型subscript的一维数组上使用Cellule。 此数组表示二维,并使用名为Position的自定义类型进行封装。

以下代码无法在指定行上编译并出现以下错误:

  • 找不到会员'someValue'
  • 无法使用“位置”类型的索引下标“[Cellule]”类型的值

您可能会注意到Cellule类型在数组中不是可选的。

以下是代码:

///                                                 
///           ◀──────row──────▶                     
///                                                 
///      ▲    ╔═══════════════╗                     
///      │    ║          ┌─┐  ║                     
///      │    ║          │█│──╬─────▶   Cellule     
///   column  ║          └─┘  ║                     
///      │    ║               ║                     
///      │    ║               ║                     
///      │    ║               ║                     
///      ▼    ╚═════ Grille ══╝      ┌ Position ───┐
///                                  │             │
///                                  │• row        │
///                                  │• column     │
///                                  └─────────────┘


/// Encapsulate position information
struct Position {
    var row: Int
    var column: Int
}

/// Data stored in the array
struct Cellule {
    var someValue:Bool
    /// some other values
}

/// Array to store data
struct Grille {

    let width:Int          // Number of columns
    let height:Int         // Number of lines

    private var laGrille:[Cellule]

    mutating func changeSomething (thePosition: Position, value:Bool) {
        laGrille[thePosition].someValue = active
     /// Error: Could not find member 'someValue'

        let cell:Cellule = laGrille[thePosition]
     /// Error: Cannot subscript a value of type '[Cellule]' with an index of type 'Position'   
    }


    subscript(position:Position) -> Cellule {
        get {
            return laGrille[position.row*width + position.column]
        }
        set {
            laGrille[position.row*width + position.column] = newValue
        }
   }

}

1 个答案:

答案 0 :(得分:1)

您的subscript(position:Position) -> Cellule方法是一种方法 struct Grille的{​​{1}},因此您只能将其应用于实例 该类型(而不是具有laGrille类型的[Cellule]

你可能意味着什么

self[thePosition].someValue = active
// ....
let cell = self[thePosition]

然后,下标方法访问(私有)laGrille 属性。