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

Posted

技术标签:

【中文标题】使用下标时出错:无法使用类型索引为类型值下标...【英文标题】:Error while using subscript: Cannot subscript a value of type... with an index of type 【发布时间】:2015-05-19 16:48:22 【问题描述】:

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

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

找不到成员“someValue” 无法使用“Position”类型的索引为“[Cellule]”类型的值下标

您可能注意到Celluletype 在数组中不是可选的。

这里是代码:

///                                                 
///           ◀──────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】:

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

你的意思可能是

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

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

【讨论】:

怎么样,谢谢,你是对的!非常感谢你!然后我必须将包含Cellule 的数组封装在一个新类型上,并在其上移动subscript 以获得:laGrille[thePosition].someValue = active

以上是关于使用下标时出错:无法使用类型索引为类型值下标...的主要内容,如果未能解决你的问题,请参考以下文章

无法使用“Int”类型的索引为“[String : String]”类型的值下标

Swift - 无法使用“IndexPath”类型的索引为“[Array<String>]”类型的值下标

无法使用“Any?”类型的索引为“[AnyHashable:Any]”类型的值下标

无法使用 [NSIndexPath] 类型的索引为 [String] 类型的值下标 - prepareForSegue

无法使用“String”类型的索引为“[String : AnyObject]”类型的值下标

错误:无法使用“UIImagePickerController.InfoKey”类型的索引为“[String:Any]”类型的值下标 [重复]