转换错误:类型“任何”没有下标成员

Posted

技术标签:

【中文标题】转换错误:类型“任何”没有下标成员【英文标题】:Converting error: Type 'Any' has no subscript members 【发布时间】:2017-03-15 16:51:32 【问题描述】:

将 for 循环转换为 Swift 3 后,出现错误“Type 'Any' has no subscript members”

for inputKey in inputKeys where attributes[inputKey]?[kCIAttributeClass] == "NSNumber"
                                .....................^



我希望添加类似

的内容
for inputKey in inputKeys where attributes[inputKey]as?[String:Any][kCIAttributeClass] == "NSNumber"

但这不起作用:-( Swift 语法还是有一些问题。

【问题讨论】:

attributes 在哪里/如何定义?基本上编译器必须知道所有下标对象的类型。 实际上,where 仍然支持for in 循环。 Type 'Any' Has no Subscript Members in xcode 8 Swift 3的可能重复 @JAL AnyObject 也无济于事 【参考方案1】:

看起来您希望 attributes 实际上是 [String: [String: String]] - 字典字典。

要么这样,要么您可以将attributes[inputKey] 转换为[String:String]

我认为这可行:

for inputKey in inputKeys where (attributes[inputKey] as? [String:String])?[kCIAttributeClass] == "NSNumber"

按 cmets 编辑:

由于 attributes 实际上并不能保证是 [String: [String: String]],而只能是 [String: [String: Any]](甚至可能不是这样),因此您需要额外的 as? 演员表才能保证安全。

由于一行中有这么多的转换,我认为最好将测试放在 for 正文开头的 guard 语句中,而不是使用这么大的 where 子句。

【讨论】:

谢谢,这正是我们所需要的 :-) 虽然这会编译,但它可能不会产生预期的结果。根据documentation,attributes 中的字典可能是[String:Any] 类型。 在这种情况下,您可能需要将attributes[inputKey] 转换为[String:Any],并将[kCIAttributeClass] 下标的结果转换为as? String。通过所有这些转换,在循环体的开头使用 guard 语句而不是这样复杂的 where 子句可能会更简洁。 您可能应该将评论添加为对原始答案的编辑,因为对 [String:String] 的强制转换在大多数情况下(如果不是全部)都会失败。 如果它设置为 [String:Any] 并与“NSNumber”进行比较,您将收到错误“二元运算符 '==' 不能应用于 'Any?' 类型的操作数?”和'字符串'"

以上是关于转换错误:类型“任何”没有下标成员的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 4.0 上的“类型‘任何’没有下标成员”错误

Swift 中的“类型‘值’没有下标成员”错误

类型“任何”没有下标成员[重复]

在 swift 3 中打印 json 时出现任何下标成员错误 [重复]

在 UserDefaults 中访问字典时,类型“任何”没有下标成员

为firebase数据库创建用户对象时,类型“任何”没有下标成员[重复]