类型的值'字符串'不符合预期的字典值类型' AnyObject'

时间:2016-08-01 14:10:31

标签: swift

在Swift中创建字典时出现此错误:

  

类型'字符串'的值不符合预期的字典值   输入' AnyObject'

代码:

let joeSmith : [String : AnyObject] = ["Name" : "Joe Smith", "Height" : 42, "Soccer Expo" : true, "Guardian" : "Jim and Jan Smith"]

3 个答案:

答案 0 :(得分:52)

Swift 3

首先,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]

Swift 2

这里的问题是您将字典的值定义为AnyObject而Swift中的String NOT 是一个对象,它是{{1 }}

enter image description here

编译器抱怨String,因为它是第一个错误,但如果你删除它,它会给你一个错误,42又是一个Int然后是struct

enter image description here

Struct(Bool - > Struct)会遇到同样的问题。

enter image description here

您可以通过两种方式解决此问题:

基金会#1

如果你添加true,那么Swift结构会自动桥接到import Foundation(这是一个对象)并且编译器很高兴

enter image description here

任何#2

您将NSString替换为AnyObject。现在,您可以在字典中添加任何类型的值。

enter image description here

<强>考虑

嘘我们(Swift开发人员)应该逐步停止依赖Objective-C桥接并使用第二种解决方案。

答案 1 :(得分:1)

使用它会有所帮助

let plistDict: [String: Any] = ["key": "Value"]

答案 2 :(得分:0)

OMHO如果你使用的是Any或AnyObject,那么你就错过了使用强类型语言的重点

因为swift中的枚举可以保存相关数据,这里的一个好答案就是改变你使用语言的方式并创建一个枚举来捕获不同的情况,然后使用枚举作为一种类型。 如果字典实际上代表了它自己的类,那么你可能需要定义类。 无论你做什么,都应该向你尖叫,你的代码出了问题。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html