访问引用字典的任意类型数组的下标
Access subscript of array of type any refering to dictionaries
SO 上有很多关于在 ANY 类型的对象数组上使用下标的问题,通常建议将 Any 对象转换为可以采用类似
的下标的变量类型
if let addresses = profile["Addresses"] as? [[String: Any]]
在我的例子中,数组是一个形式为 (paramName:value) 或 (NSString: Float) 的字典数组,但是,尽管有关于 SO 的所有答案,但我无法弄清楚语法来告诉编译器认为 Any 对象是字典。
我的原始代码产生错误:
func getStringFromSortedArray (sortedArray:Array<Any>) -> String{
for i in 0 ..< sortedArray.count {
if let paramName = sortedArray[i]["param"] {
//run some code
}
我试过了
for i in 0 ..< sortedArray.count {
if let paramName = sortedArray[i]["param"] as? [[String: Any]] {
//run some code
}
,
if let sortedArray = sortedArray as? [[Dictionary: Any]] {
for i in 0 ..< sortedArray.count {
if let paramName = sortedArray[i]["param"] {
//run some code
}
}
还有很多变化都没有成功。
有人可以指点我更正语法以通知编译器 Any 对象是字典吗?如果有人认为这个问题以前已经回答过,我将不胜感激你给我指出一个包含一系列字典的例子,因为我已经看过不同设置的答案。
如果我理解正确的话,你是说 sortedArray
是像 [[String : Any]]
这样的字典数组。我 相信 你还说键 "param" 包含一个字符串,这就是你试图从这个函数中得到的。如果这是正确的,那么您似乎非常接近,但遗漏了一些东西:
func getStringFromSortedArray (sortedArray:Array<Any>) -> String {
//If your sortedArray is an array of dictionaries let's cast it as such
guard let dictionaries = sortedArray as? [[String : Any]] else { return "None Found" }
for i in 0 ..< dictionaries.count {
//Now we can loop through the dictionaries, and check that "param" contains a string
if let paramName = dictionaries[i]["param"] as? String {
//Now we have a reference to "paramName" and can return it or do whatever "run some code" means
//run some code
}
}
当然,如果 guard
语句失败,您将需要自定义发生的情况,如果您的 for 循环完成但没有找到您想要的值,您还必须添加一个有效的 return 值正在寻找。
让我们看看你第一行代码的问题:
func getStringFromSortedArray (sortedArray:Array<Any>) -> String {
这是错误的,因为你没有说明数组元素的类型。您 知道 它是一个字典数组,但您向编译器隐藏了这一事实。这意味着你不能离开这里去任何地方。
所以如果你知道它是一个字典数组,你应该说它是一个字典数组:
func getStringFromSortedArray (sortedArray:[[AnyHashable:Any]]) -> String {
现在知道的多了就多说吧。例如,如果你知道这些字典中的所有 keys 都是字符串,你应该这样说:
func getStringFromSortedArray (sortedArray:[[String:Any]]) -> String {
如果你知道字典中的值都是同一种类型,你也应该这么说:
func getStringFromSortedArray (sortedArray:[[String:Float]]) -> String {
声明某物的类型时,始终尽可能具体。
SO 上有很多关于在 ANY 类型的对象数组上使用下标的问题,通常建议将 Any 对象转换为可以采用类似
的下标的变量类型if let addresses = profile["Addresses"] as? [[String: Any]]
在我的例子中,数组是一个形式为 (paramName:value) 或 (NSString: Float) 的字典数组,但是,尽管有关于 SO 的所有答案,但我无法弄清楚语法来告诉编译器认为 Any 对象是字典。
我的原始代码产生错误:
func getStringFromSortedArray (sortedArray:Array<Any>) -> String{
for i in 0 ..< sortedArray.count {
if let paramName = sortedArray[i]["param"] {
//run some code
}
我试过了
for i in 0 ..< sortedArray.count {
if let paramName = sortedArray[i]["param"] as? [[String: Any]] {
//run some code
}
,
if let sortedArray = sortedArray as? [[Dictionary: Any]] {
for i in 0 ..< sortedArray.count {
if let paramName = sortedArray[i]["param"] {
//run some code
}
}
还有很多变化都没有成功。
有人可以指点我更正语法以通知编译器 Any 对象是字典吗?如果有人认为这个问题以前已经回答过,我将不胜感激你给我指出一个包含一系列字典的例子,因为我已经看过不同设置的答案。
如果我理解正确的话,你是说 sortedArray
是像 [[String : Any]]
这样的字典数组。我 相信 你还说键 "param" 包含一个字符串,这就是你试图从这个函数中得到的。如果这是正确的,那么您似乎非常接近,但遗漏了一些东西:
func getStringFromSortedArray (sortedArray:Array<Any>) -> String {
//If your sortedArray is an array of dictionaries let's cast it as such
guard let dictionaries = sortedArray as? [[String : Any]] else { return "None Found" }
for i in 0 ..< dictionaries.count {
//Now we can loop through the dictionaries, and check that "param" contains a string
if let paramName = dictionaries[i]["param"] as? String {
//Now we have a reference to "paramName" and can return it or do whatever "run some code" means
//run some code
}
}
当然,如果 guard
语句失败,您将需要自定义发生的情况,如果您的 for 循环完成但没有找到您想要的值,您还必须添加一个有效的 return 值正在寻找。
让我们看看你第一行代码的问题:
func getStringFromSortedArray (sortedArray:Array<Any>) -> String {
这是错误的,因为你没有说明数组元素的类型。您 知道 它是一个字典数组,但您向编译器隐藏了这一事实。这意味着你不能离开这里去任何地方。
所以如果你知道它是一个字典数组,你应该说它是一个字典数组:
func getStringFromSortedArray (sortedArray:[[AnyHashable:Any]]) -> String {
现在知道的多了就多说吧。例如,如果你知道这些字典中的所有 keys 都是字符串,你应该这样说:
func getStringFromSortedArray (sortedArray:[[String:Any]]) -> String {
如果你知道字典中的值都是同一种类型,你也应该这么说:
func getStringFromSortedArray (sortedArray:[[String:Float]]) -> String {
声明某物的类型时,始终尽可能具体。