无法使用“Int”类型的索引为“[String : String]”类型的值下标

Posted

技术标签:

【中文标题】无法使用“Int”类型的索引为“[String : String]”类型的值下标【英文标题】:Cannot subscript a value of type '[String : String]' with an index of type 'Int' 【发布时间】:2019-08-14 06:26:30 【问题描述】:

我正在尝试将图像与我的菜单表视图的字符串相关联,但我不断收到错误消息:

不能使用“Int`”类型的索引为“[String : String]”类型的值下标

代码:

var menuItems:[String:String] = ["image1":"Order", "image2":"Notifications", "image3":"Free orders", "image4":"Payment", "image5":"Help", "image6":"Settings"]

cellForRow:

cell.pageIcon.image = UIImage(named: menuItems[indexPath.row][0])
cell.pageName.text = menuItems[indexPath.row][1]

【问题讨论】:

字典不算作数组。字典中的项目将始终是随机顺序。因此,如果您想从字典中获取项目,则必须循环字典或通过键获取每个项目 我并没有真正遵循您想要实现的目标。请详细说明一下好吗? 【参考方案1】:

在下面的代码中,

var menuItems:[String:String] = ["image1":"Order", "image2":"Notifications", "image3":"Free orders", "image4":"Payment", "image5":"Help", "image6":"Settings"]

menuItemsDictionary。由于它是dictionary,因此其中的项目将是无序。因此,每当您尝试根据indexPath 从中获取元素时,每次都可能得到不同的结果。

错误原因

另外,由于它是[String:String] 类型的Dictionary,因此您绝对不能使用Int 从中获取元素,即indexPath.row 作为subscript。这就是您收到错误的原因。

解决方案:

相反,您必须创建一个单独的类型 - class/struct 来存储单个 menuItem

struct MenuItem 
    let pageIcon: String
    let pageName: String

现在,menuItems array 将是 [MenuItem] 类型,

var menuItems = [MenuItem]()
menuItems.append(MenuItem(pageIcon: "image1", pageName: "Order"))
menuItems.append(MenuItem(pageIcon: "image2", pageName: "Notifications"))
menuItems.append(MenuItem(pageIcon: "image3", pageName: "Free orders"))
menuItems.append(MenuItem(pageIcon: "image4", pageName: "Payment"))
menuItems.append(MenuItem(pageIcon: "image5", pageName: "Help"))
menuItems.append(MenuItem(pageIcon: "image6", pageName: "Settings"))

menuItems 将包含包含所需数据的 MenuItem 对象。使用menuItems 作为dataSourcetableView

现在,在tableView(_: cellForRow:),你可以得到menuItem的赞,

cell.pageIcon.image = UIImage(named: menuItems[indexPath.row].pageIcon)
cell.pageName.text = menuItems[indexPath.row].pageName

【讨论】:

【参考方案2】:

menuItems 是具有 String 键和 String 值的字典。

您只能使用String 访问其元素,如下所示:

let menuItem = menuItems["image\(indexPath.row)"]

【讨论】:

【参考方案3】:

不要混淆数组和字典!

这里您使用的是字典,这意味着可以使用它们的键访问元素。例如menuItems["image1"] 的值为“Order”。

另一方面,数组元素可以通过其索引访问。

因此,在您的情况下,您应该使用数组并使用它们的索引访问值,如下所示:

var menuItems: [String] = ["Order", "Notifications", "Free orders", "Payment", "Help", "Settings"]
cell.pageName.text = menuItems[indexPath.row]

【讨论】:

【参考方案4】:

您收到错误是因为您无法使用与字典的 key 类型不同的类型为字典下标,在您的情况下为 String,这意味着您只能使用 @987654323 下标@值:

let pageName = menuItems["image1"] // This will return "Order"

我不确定你的确切用例是什么,但我假设这就是你想要做的:-

1) 制作图片名称和页面名称的数组:

let yourImageNamesArray = Array(menuItems.keys)
let yourPageNamesArray = Array(menuItems.values)

2) 在你的cellForRow:

cell.pageIcon.image = UIImage(named: yourImageNamesArray[indexPath.row])
cell.pageName.text = yourPageNamesArray[indexPath.row]

【讨论】:

【参考方案5】:

menuItems 是您需要使用键值访问的字典,例如

    cell.pageIcon.image = UIImage(named: menuItems["image\(indexPath.row)"])
    cell.pageName.text = menuItems["image\(indexPath.row)"]

你可以直接使用字符串数组,而不是使用字典

    var menuItems:[String] = ["Order", "Notifications", "Free orders", "Payment", "Help", "Settings"]

在tableview单元格中,您可以访问

   cell.pageIcon.image = UIImage(named: menuItems[indexPath.row])
   cell.pageName.text = menuItems[indexPath.row]

【讨论】:

以上是关于无法使用“Int”类型的索引为“[String : String]”类型的值下标的主要内容,如果未能解决你的问题,请参考以下文章

不能为“[(String)] 类型的值下标?”具有“Int”类型的索引

无法使用“String”类型的索引为“[String : AnyObject]”类型的值下标

无法使用 [NSIndexPath] 类型的索引为 [String] 类型的值下标 - prepareForSegue

尝试修复 Swift 3 错误;无法使用“String”类型的索引为“[[String:AnyObject]]”类型的值下标[关闭]

错误:无法使用“UIImagePickerController.InfoKey”类型的索引为“[String:Any]”类型的值下标 [重复]

Swift - 无法使用“IndexPath”类型的索引为“[Array<String>]”类型的值下标