“类型”;任何;尽管在Swift 3上使用AnyObject,但没有下标成员?

“类型”;任何;尽管在Swift 3上使用AnyObject,但没有下标成员?,swift,xcode,Swift,Xcode,最近将代码从早期版本的swift转换为swift 3。有很多错误表明类型“any”没有下标成员,我认为可以通过强制转换为AnyObject来修复,但是错误仍然存在(因此我在这里发布的代码中没有这种强制转换)。以下是相关代码: func textfieldTextWasChanged(_ newText: String, parentCell: CustomCell) { let parentCellIndexPath = tblExpandable.indexPath(for:

最近将代码从早期版本的swift转换为swift 3。有很多错误表明类型“any”没有下标成员,我认为可以通过强制转换为AnyObject来修复,但是错误仍然存在(因此我在这里发布的代码中没有这种强制转换)。以下是相关代码:

func textfieldTextWasChanged(_ newText: String, parentCell: CustomCell) {
        let parentCellIndexPath = tblExpandable.indexPath(for: parentCell)

        var address = ""

        address = "\(newText)"

        // TODO: add a pin to the map from input address
        cellDescriptors[0][11].setValue(address, forKey: "primaryTitle")
        location = cellDescriptors[0][11]["primaryTitle"]! as! String
        tblExpandable.reloadData()
    }

请注意,CellDescriptor在代码前面定义为
NSMutableArray
。该错误显示在其所在的两行中的
单元格描述符[0]
之后。不确定如何修复此问题。

这是因为您使用了多个下标运算符,因为这可能类似于数组数组。但是
NSMutableArray
的下标运算符返回
Any
。因此,
cellDescriptor[0]
Any
。您尝试对结果使用
[11]
,但
Any
不接受下标,因为它是
Any
,不是集合类型

强制转换到
AnyObject
没有帮助,因为
AnyObject
也不是集合类型

您应该做的是将
CellDescriptor[0]
强制转换为接受下标的对象。正确的选择取决于存储在
CellDescriptor
中的数据类型,但它可能是某种类型的集合,可能是数组类型


另一种方法是将
cellDescriptor
更改为Swift类型,而不是
NSMutableArray
。您可以专门为数据结构的每个部分声明类型,然后就不需要进行类型转换。

CellDescriptor的声明是什么样子的?为什么不将其转换为正确的类型?e、 g.
[String:String]
[String:AnyObject]
?@TomHarrington声明如下:
var cellsdescriptor:NSMutableArray我理解您对答案的解释,但不知道如何将每个答案打印出来。cellDescriptors是一个数组,[0]引用该数组中的第一个数组组(尽管只有一个),然后11是将信息存储为字符串的行。不确定每个角色的最佳角色是什么?是否应该将[0]重铸为
[(0作为NSMutableArray)]
和最终的
[(11作为字符串)]
?您可以将
单元格描述符[0]
键入您知道的任何类型
单元格描述符[0]
。如果它是一个
NSArray
,则键入它。如果是其他问题,请键入您希望出现的任何内容。我使用键入来修复错误(当我切换到swift 3时,由于此问题,共有20个错误),并理解错误为何是错误以及修复为何会修复它,但为什么在以前的swift版本中它不是问题?斯威夫特3是否将默认施法改为任意施法,并且它以前的施法方式不同?我不清楚,但我在转到斯威夫特3时有过一些“这是如何工作的?”的经历。对某些事情似乎更为严格。