无法将类型'(key:String,value:AnyObject)'的值转换为预期的参数类型'[String:AnyObject]'

时间:2017-09-24 15:22:34

标签: ios json swift3

我正试图从我收到的JSON响应中获取$ heroku run bash $ rails c url,如下图所示: enter image description here 因此,为了达到thumbnail_images,我创建了一个名为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)) } } } } 行上,我收到此错误:

  

无法将类型'(key:String,value:AnyObject)'的值转换为预期的参数类型'[String:AnyObject]'

这是我的问题,但我认为分享更多代码是相关的,因为为了达到self.thumbnail_images.append(ThumbImages(dict: img))我需要更多的课程urlThumbImages。其中包含以下代码:

MedLargeImage

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

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]))
            }
        }
    }

更新

如果我将帖子类中的class MedLargeImage: NSObject { var imageUrl: String? init(dict: [String: AnyObject]) { super.init() self.imageUrl = dict["url"] as? String } } 更改为:

if let postImage

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

3 个答案:

答案 0 :(得分:5)

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

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

可以解析字典以使用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))
            }
        }
    }
}

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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