无法将 String 类型的值分配给 AnyObject 类型?斯威夫特 3.0

Posted

技术标签:

【中文标题】无法将 String 类型的值分配给 AnyObject 类型?斯威夫特 3.0【英文标题】:Cannot assign value of type String to type AnyObject? Swift 3.0 【发布时间】:2016-09-22 05:33:26 【问题描述】:

我突然收到以下类型字典的错误:

var parameters = [String: AnyObject]()

然后如果我尝试:

parameters["cancelled_by"] = someUser ?? ""

我得到的错误是:

无法将 String 类型的值赋给 AnyObject 类型?

这是给Swift 3.0的。我在这里做错了什么?为什么它不起作用?

【问题讨论】:

someUser 是如何定义的? 【参考方案1】:

String值类型AnyObject 只接受引用类型。因此,为了在Dictionary 中添加值类型和引用类型,请使用Any 而不是AnyObject,即

var parameters = [String: Any]()

这是对 Swift 3.0 的补充。

【讨论】:

【参考方案2】:

我现在开始使用 Swift 3,有点晚了……但是,在 Swift 2.2 之前,一些 Swift 值类型会自动桥接到相应的基础引用类型,例如 StringNSString、@987654323 @ 到 NSDictionary,等等。看起来这种自动桥接已在 Swift 3 中删除。

在某些情况下,将[String : AnyObject] 转换为[String : Any] 是有意义的,在其他情况下则不然,这取决于您在做什么。在我目前需要引用类型的情况下,它不需要。

所以我通过转换为AnyObject 请求显式桥接来解决问题:

var dictionary: [String : AnyObject] = [:]
dictionary["valueType"] = "Value Type" // Error
dictionary["referenceType"] = "Reference Type" as AnyObject // OK

供参考:

let text = "Text"
let asAny = text as Any
let asAnyObject = text as AnyObject
let asNSString: NSString = text as NSString

type(of: text) // Prints String.Type
type(of: asAny) // Prints String.Type
type(of: asAnyObject) // Prints _NSContiguousString.Type
type(of: asNSString) // Prints _NSContiguousString.Type

【讨论】:

以上是关于无法将 String 类型的值分配给 AnyObject 类型?斯威夫特 3.0的主要内容,如果未能解决你的问题,请参考以下文章

无法将“String”类型的值分配给“UILabel”类型

无法将 String 类型的值分配给 AnyObject 类型?斯威夫特 3.0

“无法将类型 'String' 的值分配给类型 'AnyObject?'”,Swift 3,Xcode 8 beta 6

如何更正错误“无法将 [NSManagedObject] 类型的值分配给 [String] 类型

无法将“Int”类型的值分配给“String”类型?在 (cellForRowAt) 中使用 Tableview

使用 SwiftUI 从 Cloud Firestore 中的集合“配置文件”中获取数据。无法将类型“[String:Any]”的值分配给类型“UserProfile”