如何从Swift数组中访问CodigosAutorizacion结构体的属性?
解决Swift数组下标和属性访问的错误问题
咱们先拆解一下你遇到的两个错误,其实根源都是同一个:codes数组的类型没有明确指定,导致Swift无法正确推断出数组元素的类型。
错误原因分析
- No exact matches in call to subscript:如果你只是用
var codes = []声明数组,Swift会默认把它推断成[Any]类型(任意元素的数组)。当你用codes[indexPath.row]访问时,Swift不确定返回的元素是什么类型,所以找不到精确匹配的下标调用。 - Reference to member 'instancia' cannot be resolved without a contextual type:因为
codes[indexPath.row]返回的是Any类型,而Any并没有instancia这个属性,所以编译器无法解析这个成员访问。
解决方案步骤
1. 明确声明数组类型
首先,把codes数组明确声明为CodigosAutorizacion类型的数组,这样Swift就知道数组里存的都是这个类型的对象:
// 两种写法都可以,选你习惯的就行 var codes: [CodigosAutorizacion] = [] // 或者 var codes = [CodigosAutorizacion]()
2. 修正循环逻辑(隐藏的bug)
另外,你的循环代码里还有一个容易忽略的问题:你遍历的是0..<array.count,但每次创建CodigosAutorizacion时都用的是同一个validateData,这会导致数组里所有元素都是完全一样的对象!你应该遍历array里的每个元素,用当前元素来初始化对象:
for data in array { let codeItem = CodigosAutorizacion( code: data["codigo"] as? String, codeCancel: data["cancela_codigo"] as? String, codeSite: data["cod_sitio"] as? String, codeSiteCancel: data["cancela_cod_sitio"] as? String, instance: data["instancia"] as? String ) codes.append(codeItem) }
(这里把变量名从codeArray改成了codeItem,因为它是单个对象,不是数组,更符合语义)
3. 正常访问数组元素属性
现在codes数组的类型是[CodigosAutorizacion],codes[indexPath.row]会直接返回CodigosAutorizacion类型的对象,你可以正常访问它的instance属性了:
codeCell.codigoSitio.text = codes[indexPath.row].instance
这样修改后,两个错误都会消失,你也能正常用这个数组来生成表格啦。
内容的提问来源于stack exchange,提问作者Angel Davila
相关产品推荐
相关产品推荐

