“类型”;任何;尽管在Swift 3上使用AnyObject,但没有下标成员?
最近将代码从早期版本的swift转换为swift 3。有很多错误表明类型“any”没有下标成员,我认为可以通过强制转换为AnyObject来修复,但是错误仍然存在(因此我在这里发布的代码中没有这种强制转换)。以下是相关代码:“类型”;任何;尽管在Swift 3上使用AnyObject,但没有下标成员?,swift,xcode,Swift,Xcode,最近将代码从早期版本的swift转换为swift 3。有很多错误表明类型“any”没有下标成员,我认为可以通过强制转换为AnyObject来修复,但是错误仍然存在(因此我在这里发布的代码中没有这种强制转换)。以下是相关代码: func textfieldTextWasChanged(_ newText: String, parentCell: CustomCell) { let parentCellIndexPath = tblExpandable.indexPath(for:
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时有过一些“这是如何工作的?”的经历。对某些事情似乎更为严格。