【问题标题】:Subscripting problems since updating to Swift3更新到 Swift3 后的下标问题
【发布时间】:2016-09-16 23:24:02
【问题描述】:

我们的服务器端开发人员喜欢给我 JSON 字符串,其中包含字典数组的字典。这真的很令人愉快......所以我总是将它们序列化为一个 dict[String:AnyObject] 并且在我将它们拉出时简单地投射对象没有任何问题。 :( 不是今天!我修复了转换时出现的所有其他错误,但这对我来说没有意义,我查看了类似的问题,他们的代码没有反映我的情况。我这样做只是为了2 年了,所以也许我只是在使用不好的做法,有人可能会改掉我的坏习惯。无论哪种方式,我都将不胜感激。

这是我的一个解析函数的一个小sn-p,如果你需要的话,我会给你更多。

func parseRecipes()
{
    if self.avarhub.jsonDICT["recipes"]!.count > 0
    {
        for index in 0..<self.avarhub.jsonDICT["recipes"]!.count
        {
            self.avarhub.recipe.append(self.avarhub.jsonDICT["recipes"]![index]["recipe"] as! String) //the errors all happen on these lines
 //they say ambiguous reference to member 'subscript' or Type 'Any' has no subscript members
        }
    }
    self.tableviewrecipe.reloadData()
}

再次感谢您的帮助。

更多代码也许这会有所帮助?

//data struscture my variable hub
internal struct varhub
{
    //json dictionary
    var jsonDICT = [String:AnyObject]()
    var screenstatus = ""
    var location = ""
    var recipe = [String]()
    var selectedrecipe = ""
}


//this function turns JSON string into a dictionary
func jsonStringToDict(_ text: String) -> [String:AnyObject]?
{
    let data = text.data(using: String.Encoding.utf8)
    do {
        return try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]
    }
    catch _ as NSError
    {
        print("error")
    }
    return nil
}

我确实为我的 parseRecipe 函数使用了 vadian 的解决方案,我将在许多其他地方牢记这一课,但是在我的项目中有几个地方用于其他功能,我仍然必须使用我想出的解决方案,所以我放在这里也许它会有所帮助,即使它不如 vadian 的那么好。

if self.avarhub.jsonDICT["recipes"]!.count > 0
    {
        for index in 0..<self.avarhub.jsonDICT["recipes"]!.count
        {
            let recipes = self.avarhub.jsonDICT["recipes"]! as! Array<Dictionary<String, String>>
            self.avarhub.recipe.append(recipes[index]["recipe"]!)
        }
    }
    self.tableviewrecipe.reloadData()

【问题讨论】:

  • 我添加了更多代码来试图澄清我的问题。打算试试 vadian 的建议

标签: json swift3


【解决方案1】:

在 Swift 3 中,编译器需要知道连续键或索引订阅中所有中间对象的类型,以防止运行时错误。

解决办法是告诉编译器,键recipes的值是一个字典数组。

这与您的方法相同,但没有丑陋的 C 样式循环和多余的空检查。

func parseRecipes()
{
    for recipeItem in self.avarhub.jsonDICT["recipes"] as! [[String:Any]] {
        self.avarhub.recipe.append(recipeItem["recipe"] as! String)
    }
    self.tableviewrecipe.reloadData()
}

PS:AnyObject 已经在很多 API 中改为Any,你也可以调整你的代码。

【讨论】:

  • 谢谢,太棒了,我把它修好了,画得更花哨,但这太优雅了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多