2017-09-24 198 views
1

我试图从得到thumbnail_images我得到的JSON响应下面这张图: enter image description here 因此,为了达到该url我做了一个叫Posts其中无法将类型'(key:String,value:AnyObject)'的值转换为期望的参数类型'[String:AnyObject]'

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))我得到这个错误类:

Cannot convert value of type '(key: String, value: AnyObject)' to expected argument type '[String : 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])) 
      } 
     } 
    } 

正如你可以看到的截图。所以最后我在房间里我能得到的网址:

class MedLargeImage: NSObject { 

    var imageUrl: String? 

    init(dict: [String: AnyObject]) { 

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

    } 
} 

UPDATE:

如果我在文章类改变if let postImage到:

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

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

的错误是走了但是,如果条件永远不会成真。

+1

你把'postImage'作为一个数组,但它是一本字典。这就是为什么当循环时你得到这个元组,你从字典中获得键和值的元组。 – Moritz

+0

@Moritz如果我将它更改为'if let postImage = dict [“thumbnail_images”]为? [[String:AnyObject]]'它可以工作,但'如果let'不移动来运行'for'命令。 –

+1

不要在Swift 3中使用'[String:AnyObject]'作为JSON字典表示。 JSON字典是'[String:Any]',因为所有的JSON字典值都是(Swift)值类型。此外,看看你目前的'Posts'实现,我没有理由继承'NSObject'。 –

回答

1
  • 首先应该以单数形式Post/ThumbImage被命名。数据源数组例如posts包含Post实例并且每个Post实例包含ThumbImage实例的阵列thumbnailImages。这些语义使得它更易于理解设计。
  • 二斯威夫特3+所有JSON字典是根据初始化所有规则的super调用必须后初始化所有存储性能进行[String:Any]
  • 第三。

密钥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)) 
      } 
     } 
    } 
} 
+0

O ...非常感谢你!我从你那里学到了:) –

1

由于您正在循环播放postImage就好像它是一个数组,当它实际上是一个字典时,您将看到该错误消息。在你的ThumbImages类初始化程序中,你期望收录一本字典。但是,由于您正在循环访问postImage字典,因此会返回键值对中的元组。

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

在字典立即传递将解决错误:

所有类的
if let postImage = dict["thumbnail_images"] as? [String: AnyObject] { 
    self.thumbnail_images.append(ThumbImages(dict: postImage)) 
} 
相关问题