上下文类型“AnyObject”不能与字典文字一起使用?

Posted

技术标签:

【中文标题】上下文类型“AnyObject”不能与字典文字一起使用?【英文标题】:Contextual type 'AnyObject' cannot be used with dictionary literal? 【发布时间】:2016-02-26 22:50:51 【问题描述】:

我正在尝试将 Objective-C 示例转换为 Swift 2,但遇到了一个小问题。原Objective-C sn-p:

NSMutableArray *inputsOutputs = [NSMutableArray array];
...
[inputsOutputs addObject:@@"input" : input, @"output" : trackOutput];

我认为 Swift 代码应该是:

var inputsOutputs = [Any?]()
...
inputsOutputs.append([ "input": input, "output": trackOutput ])

产生的错误是:

Contextual type 'AnyObject' cannot be used with dictionary literal?

在这种情况下,我如何将 Objective-C 转换为 Swift?

原始 Objective-C:https://developer.apple.com/library/mac/samplecode/avsubtitleswriterOSX/Listings/avsubtitleswriter_main_m.html

【问题讨论】:

在我的例子中,答案是向分配给Any的字典文字添加一个强制转换...不幸的是,我无法提出一个必要的简单示例:(跨度> 【参考方案1】:

可以看到数组的内容是带有String键和未知值的字典。

因此更具体地声明数组

var inputsOutputs = [[String:AnyObject]]()

在 Swift 3 中用于 JSON 集合类型,或者如果字典/数组只包含值类型,则使用

var inputsOutputs = [[String:Any]]()

【讨论】:

谢谢,我原以为这是一个 JSON 类型对象的数组。不知道 ObjC,它没有帮助。【参考方案2】:

应该没问题,至少在 Swift 2+ 中。我刚刚在操场上尝试了以下内容:

var objects = [Any?]()
let dict = [ "one" : 1, "two" : 2 ]
objects.append(dict)  // prints [["one": 1, "two": 2]]
objects.append([ "one" : 1, "two" : 2 ]) // prints [["one": 1, "two": 2], ["one": 1, "two": 2]]

【讨论】:

我以为我使用的是 Swift 2+ 和 XCode 7.2.1。不确定在哪里检查 Swift 版本一致性设置? Xcode 7 使用 Swift 2,所以您已经回答了这个问题。您看到的错误是否可能出现在某个 不同的 行上?如果您尝试在 AnyObject 上使用下标,就会看到这种错误。

以上是关于上下文类型“AnyObject”不能与字典文字一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 上下文类型 anyobject 不能与字典文字一起使用

上下文类型 'Any' 不能与数组文字 Swift 3 一起使用

尝试从数组中删除元素时出现此错误:上下文类型“Int”不能与数组文字一起使用

如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?

上下文类型“Void”(又名“()”)不能与数组字面量一起使用

上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中