无法将类型'(key:String,value:AnyObject)'的值转换为期望的参数类型'[String:AnyObject]'
我试图从得到thumbnail_images
我得到的JSON响应下面这张图: 因此,为了达到该
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
我不得不更多类ThumbImages
和MedLargeImage
。它具有以下代码:
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))
}
}
的错误是走了但是,如果条件永远不会成真。
- 首先应该以单数形式
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))
}
}
}
}
O ...非常感谢你!我从你那里学到了:) –
由于您正在循环播放postImage
就好像它是一个数组,当它实际上是一个字典时,您将看到该错误消息。在你的ThumbImages
类初始化程序中,你期望收录一本字典。但是,由于您正在循环访问postImage
字典,因此会返回键值对中的元组。
因此,当您尝试将此元组传递给ThumbImages
初始化程序时,编译器会抱怨无法将您的元组转换为字典。
在字典立即传递将解决错误:
所有类的if let postImage = dict["thumbnail_images"] as? [String: AnyObject] {
self.thumbnail_images.append(ThumbImages(dict: postImage))
}
你把'postImage'作为一个数组,但它是一本字典。这就是为什么当循环时你得到这个元组,你从字典中获得键和值的元组。 – Moritz
@Moritz如果我将它更改为'if let postImage = dict [“thumbnail_images”]为? [[String:AnyObject]]'它可以工作,但'如果let'不移动来运行'for'命令。 –
不要在Swift 3中使用'[String:AnyObject]'作为JSON字典表示。 JSON字典是'[String:Any]',因为所有的JSON字典值都是(Swift)值类型。此外,看看你目前的'Posts'实现,我没有理由继承'NSObject'。 –