在Swift中创建字典时出现此错误:
类型'字符串'的值不符合预期的字典值 输入' AnyObject'
代码:
let joeSmith : [String : AnyObject] = ["Name" : "Joe Smith", "Height" : 42, "Soccer Expo" : true, "Guardian" : "Jim and Jan Smith"]
答案 0 :(得分:52)
首先,String
中的Swift
是一个结构,不符合AnyObject
。
解决方案#1
Swift 3中的最佳解决方案是将字典值的类型从AnyObject
更改为Any
(包括String结构)。
let joeSmith : [String : Any] = ["Name" : "Joe Smith", "Height" : 42, "Soccer Expo" : true, "Guardian" : "Jim and Jan Smith"]
解决方案#2
但是如果你真的想保持Dictionary定义为AnyObject
的值,你可以强制从String结构到NSString
类的桥接添加as AnyObject
,如下所示(I为其他值做了同样的事情)
let joeSmith : [String : AnyObject] = [
"Name" : "Joe Smith" as AnyObject,
"Height" : 42 as AnyObject,
"Soccer Expo" : true as AnyObject,
"Guardian" : "Jim and Jan Smith" as AnyObject]
这里的问题是您将字典的值定义为AnyObject
而Swift中的String
NOT 是一个对象,它是{{1 }}
编译器抱怨String,因为它是第一个错误,但如果你删除它,它会给你一个错误,42又是一个Int然后是struct
。
Struct
(Bool - > Struct)会遇到同样的问题。
您可以通过两种方式解决此问题:
基金会#1
如果你添加true
,那么Swift结构会自动桥接到import Foundation
(这是一个对象)并且编译器很高兴
任何#2
您将NSString
替换为AnyObject
。现在,您可以在字典中添加任何类型的值。
<强>考虑强>
嘘我们(Swift开发人员)应该逐步停止依赖Objective-C桥接并使用第二种解决方案。答案 1 :(得分:1)
使用它会有所帮助
let plistDict: [String: Any] = ["key": "Value"]
答案 2 :(得分:0)
因为swift中的枚举可以保存相关数据,这里的一个好答案就是改变你使用语言的方式并创建一个枚举来捕获不同的情况,然后使用枚举作为一种类型。 如果字典实际上代表了它自己的类,那么你可能需要定义类。 无论你做什么,都应该向你尖叫,你的代码出了问题。