下标的模糊使用

时间:2015-11-25 11:52:30

标签: ios swift uitableview nsmutablearray

我有一个可扩展的表,其中自定义单元格在点击可见行时显示或消失。单元格的数据存储在plist中,并声明为NSMutableArray。

我对下标'进行了模糊的使用。以下代码中的错误,并希望其他人遇到此并知道修复。 我已经尝试了所有可能的选择,我必须补充我的有限知识。

var cellDescriptors: NSMutableArray!

func getCellDescriptorForIndexPath(indexPath: NSIndexPath) -> [String: AnyObject] {
        let indexOfVisibleRow = visibleRowsPerSection[indexPath.section][indexPath.row]
        let cellDescriptor = cellDescriptors[indexPath.section][indexOfVisibleRow] as! [String: AnyObject]
        return cellDescriptor
    }

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let indexOfTappedRow = visibleRowsPerSection[indexPath.section][indexPath.row]

        if cellDescriptors[indexPath.section][indexOfTappedRow]["isExpanded"] as! Bool == true {  // Ambiguous use of subscript error
            var shouldExpandAndShowSubRows = false
            if cellDescriptors[indexPath.section][indexOfTappedRow]["isExpanded"] as! Bool == false {  // Ambiguous use of subscript error
                // In this case the cell should expand.
                shouldExpandAndShowSubRows = true
            }

3 个答案:

答案 0 :(得分:3)

Cor,我假设您现在已经解决了这个问题但找到了解决方案后,我想我会引起您的注意:

    func getCellDescriptorForIndexPath(indexPath: NSIndexPath) -> [String: AnyObject] {
    let indexOfVisibleRow = visibleRowsPerSection[indexPath.section][indexPath.row]
    // HERE IS WHAT YOU WANT: 
    let cellDescriptor = (cellDescriptors[indexPath.section] as! NSMutableArray)[indexOfVisibleRow] as! [String: AnyObject]
        return cellDescriptor
    }

答案 1 :(得分:1)

编译器告诉您它无法确定您实际订阅的对象类型是否可以下载。您还没有提供任何有关您所谓的"单元格描述符"的信息。因此很难确定问题是什么,但看起来您希望从indexOfTappedRow的下标调用中查找字典。

这可能是由于使用了NSArray / NSMutableArrayNSDictionary / NSMutableDictionary等Cocoa集合,它们是AnyObject的容器(丢失类型)关于它究竟存储的信息。由于这些是免费的桥接到Swift阵列和字典,因此很容易改变您的模型(包括容器)以使用特定类型,以便您的容器可以明确地声明他们已经'' ; CellDescriptor"的数组(与NSArray""一组随机类型的对象(AnyObject)")。通过这种方式,你不必做一些令人讨厌的事情,例如通过一些容易出错的字符串来查找属性,你可能会在这里或那里输入错误(使用as!会使这种情况变得更糟,这要求它是& #34;有效或爆炸"与"真或假")。

将Swift的强类型系统视为可以利用的东西,而不是尽可能避免的东西。事情真的变得容易多了。

评论更新

在这种情况下(因为PLIST是一个纯Cocoa对象图),您只需扩展代码即可一步一步地完成任务。那就是:

  1. 将该部分作为一个字典数组(我们假设这个结构,因为它是一个已知的结构的PLIST,但总有出乎意料的空间......)
  2. 获取行as? NSDictionary的字典(提示:if let...
  3. 获取"isExpanded"密钥as? NSNumber的价值(提示:if let...
  4. 如果您已经做到这一点,请使用NSNumber' s boolValue。没有含糊之处。

答案 2 :(得分:0)

if cellDescriptors[indexPath.section][indexOfTappedRow]["isExpanded"] as! Bool == true { 
        var shouldExpandAndShowSubRows = false
        if cellDescriptors[indexPath.section][indexOfTappedRow]["isExpanded"] as! Bool == false {  // Ambiguous use of subscript error
            // In this case the cell should expand.
            shouldExpandAndShowSubRows = true
        }
}

应替换为:

if **((cellDescriptors[indexPath.section] as! NSMutableArray)[indexOfTappedRow] as AnyObject)["isExpandable"] as! Bool** == true {
        var shouldExpandAndShowSubRows = false
        if ((cellDescriptors[indexPath.section] as! NSMutableArray)[indexOfTappedRow] as AnyObject)["isExpanded"] as! Bool == false {
            // In this case the cell should expand.
            shouldExpandAndShowSubRows = true
        }
}