【问题标题】:Value of type 'String' does not conform to expected dictionary value type 'AnyObject'“String”类型的值不符合预期的字典值类型“AnyObject”
【发布时间】:2016-12-06 15:55:32
【问题描述】:

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

“字符串”类型的值不符合预期的字典值 输入“任何对象”

代码:

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

【问题讨论】:

  • 嘿杰克,@appzYourLife 为您的问题提供了一个非常好的答案,但您尚未接受。如果这只是一个疏忽,你真的应该接受它。

标签: swift


【解决方案1】:

斯威夫特 3

首先,Swift 中的String 是一个结构,并且符合AnyObject

解决方案 #1

Swift 3 中最好的解决方案是将 Dictionary Value 的类型从 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 的桥接,如下所示(我对其他值)

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]

斯威夫特 2

这里的问题是您将字典的值定义为AnyObject,而在Swift 中String不是对象,它是struct

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

true (Bool -> Struct) 也会有同样的问题。

你可以通过两种方式解决这个问题:

基础#1

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

任何 #2

您将AnyObject 替换为Any。现在您可以在字典中输入任何类型的值。

注意事项

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

【讨论】:

  • 我正在使用第二种解决方案,但是如果您有具有大量模型的大型应用程序并且您使用 Any 那么编译器在 swift 2.3 中几乎可以无休止地编译,但在 swift 3 中它不再编译.编译器似乎没有优化 Any。
  • @appzYourLife 这种行为是否改变了,或者我只是错过了什么?尝试执行此类操作时出现错误,即使已导入 Foundation:let dict: [String : AnyObject] = ["hello" : "world"]。错误是Value of type 'String' does not conform to expected dictionary value type 'AnyObject'
  • 我刚刚看到所有对我的评论的支持。是的,这已经改变了。在 Swift 3 中,Swift 类型不再通过导入隐式桥接到 Foundation 类型。请参阅Why aren't Swift Strings bridged to NSString in a Dictionary when Foundation is imported? 和链接的副本。
【解决方案2】:

用了会有帮助

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多