【问题标题】:Cannot convert value of type '(key: String, value: AnyObject)' to expected argument type '[String : AnyObject]'无法将类型“(键:字符串,值:AnyObject)”的值转换为预期的参数类型“[字符串:AnyObject]”
【发布时间】:2018-03-05 14:57:28
【问题描述】:

我正在尝试从收到的 JSON 响应中获取 urlurl,如下图所示: 所以为了到达url,我创建了一个名为Posts的类,其中

class Posts: NSObject {

    var title: String?
    var excerpt: String?
    var content: String?
    var thumbnail_images: [ThumbImages] = []

    init(dict: [String: AnyObject])
    {
        super.init()

        self.title = dict["title"] as? String
        self.excerpt = dict["excerpt"] as? String
        self.content = dict["content"] as? String

        if let postImage = dict["thumbnail_images"] as? [String: AnyObject] {

            for img in postImage  {
                self.thumbnail_images.append(ThumbImages(dict: img))
            }
        }
    }
}

在线self.thumbnail_images.append(ThumbImages(dict: img))我得到这个错误:

无法将类型“(键:字符串,值:AnyObject)”的值转换为预期的参数类型“[字符串:AnyObject]”

这就是我的问题,但我认为分享更多代码是相关的,因为为了到达url,我必须参加更多课程ThumbImagesMedLargeImage。其中有以下代码:

class ThumbImages: NSObject {

    var medium_large: [MedLargeImage] = []

    init(dict: [String: AnyObject]) {

        super.init()

        if let imgURL = dict["medium_large"] {

            for iURL in imgURL as! [AnyObject] {
                medium_large.append(MedLargeImage(dict: iURL as! [String : AnyObject]))
            }
        }
    }

正如您在屏幕截图中看到的那样。所以最后我在可以获取 URL 的房间里:

class MedLargeImage: NSObject {

    var imageUrl: String?

    init(dict: [String: AnyObject]) {

        super.init()
        self.imageUrl = dict["url"] as? String

    }
}

更新:

如果我将 Posts 类中的 if let postImage 更改为:

if let postImage = dict["thumbnail_images"] as? [[String: AnyObject]] {

            for img in postImage  {
                self.thumbnail_images.append(ThumbImages(dict: img))
            }
        }

错误消失了,但 if 条件永远不会为真。

【问题讨论】:

  • 您将postImage 视为一个数组,但它是一个字典。这就是为什么你在循环时得到这个元组,你从字典中得到键和值的元组。
  • @Moritz 如果我将其更改为 if let postImage = dict["thumbnail_images"] as? [[String: AnyObject]] 它可以工作,但 if let 不会移动到运行 for 命令。
  • 不要在 Swift 3 中使用 [String:AnyObject] 作为 JSON 字典表示。 JSON 字典是 [String:Any],因为所有 JSON 字典值都是 (Swift) 值类型。此外,查看您当前对Posts 的实现,我认为没有理由从NSObject 继承。

标签: ios json swift3


【解决方案1】:

您看到该错误消息是因为您在循环postImage,就好像它是一个数组,而它实际上是一个字典。在您的 ThumbImages 类初始化程序中,您希望使用字典。但是,由于您正在循环遍历 postImage 字典,因此这会返回键值对中的元组。

因此,当您尝试将此元组传递给 ThumbImages 初始化程序时,编译器会抱怨它无法将您的元组转换为字典。

立即传入字典即可解决错误:

if let postImage = dict["thumbnail_images"] as? [String: AnyObject] {
    self.thumbnail_images.append(ThumbImages(dict: postImage))
}

【讨论】:

    【解决方案2】:
    • 首先,类应该以单数形式命名Post / ThumbImage。数据源数组,例如posts 包含 Post 实例,每个 Post 实例包含 thumbnailImages 的数组 ThumbImage 实例。这些语义使设计更容易理解。
    • Swift 3+ 中所有 JSON 字典的第二个是 [String:Any]
    • 第三,根据初始化规则,super 调用必须在初始化所有存储的属性之后执行。

    thumbnail_images 的值是一个包含字典的字典。发生错误是因为您使用了将字典视为元组数组的 array 枚举语法。

    可以解析字典,使用key作为大小名称,使用value传递参数。

    我不知道你为什么要使用 NSObject 子类,但我相信你有你的理由。


    这是Thumbnail

    class ThumbImage: NSObject {
    
        let size: String
        var url : URL?
        let width : Int
        let height : Int
    
        init(size : String, parameters: [String: Any]) {
    
            self.size = size
            if let urlString = parameters["url"] as? String {
                self.url = URL(string: urlString)
            }
            self.width = parameters["width"] as? Int ?? 0
            self.height = parameters["height"] as? Int ?? 0
            super.init()
        }
    }
    

    这是Post

    class Post: NSObject {
    
        var title: String
        var excerpt: String
        var content: String
        var thumbnailImages = [ThumbImage]()
    
        init(dict: [String: Any])
        {
            self.title = dict["title"] as? String ?? ""
            self.excerpt = dict["excerpt"] as? String ?? ""
            self.content = dict["content"] as? String ?? ""
            super.init()
            if let images = dict["thumbnail_images"] as? [String: [String:Any] ]  {
                for (key, value) in images {
                    thumbnailImages.append(ThumbImage(size: key, parameters: value))
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      您不能直接将元组作为字典传递。 而是使用这个: 让 dicFromArray = [tuple.key :tuple.value]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 2017-01-06
        • 2016-10-04
        • 1970-01-01
        相关资源
        最近更新 更多