转换错误:类型“任何”没有下标成员
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 3 中打印 json 时出现任何下标成员错误 [重复]