下标使用不明确

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

在下面的代码中,我得到了'下标模糊的使用'错误,并希望其他人遇到这个问题并且知道修正。 我已经尝试了所有可能的select,我必须补充一些有限的知识。

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 } 

编译器告诉你不能确定你下标的对象的types实际上可以被下标。 你还没有提供任何关于你所说的“单元格描述符”的信息,所以很难确定问题是什么,但是看起来你希望从indexOfTappedRow的下标中返回字典。

这可能是由于使用了NSArray / NSMutableArrayNSDictionary / NSMutableDictionary (它们是AnyObject容器)(它丢失了存储的内容的types信息)等Cocoa集合。 由于这些是免费桥接Swift数组和字典,很容易改变你的模型(包括容器)使用特定types,以便您的容器可以明确地声明,他们是“一个CellDescriptor数组”(与NSArray是一个随机types的对象( AnyObject )的数组“)。 通过这种方式,你不必做一些不愉快的事情,比如通过一些容易出错的string来查找属性,这些string在这里或者那里可能会input错误(使用as!会变得更糟,这要求它是“有效的或者爆炸性的” “对或错”)。

把Swift的强types系统看作是可以利用的东西,而不是尽可能的避免。 事情变得更容易了。

更新评论

在这种情况下(因为PLIST是一个纯Cocoa对象图),所以你可以扩展你的代码来一步一步地做事。 那是:

  1. 获取该部分作为一个字典数组(我们假设这个结构,因为它是一个已知的结构PLIST,但总是有意外的空间…)
  2. 获取该行的字典为as? NSDictionary as? NSDictionary (提示: if let...
  3. 获取"isExpanded"键的值为as? NSNumber as? NSNumber (提示: if let...
  4. 如果你已经得到这么多,使用NSNumberboolValue 。 没有歧义。

小林,我假设你已经解决了这个问题,但是已经find了解决办法,我想我会提请你注意:

  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 } 
 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 } }