0
var peerIds = [String]()
var peersInfos: NSMutableDictionary!

self.peersInfos.addEntries(from: [peerId: ["videoView": NSNull(), "videoSize": NSNull(), "isAudioMuted": NSNull(), "isVideoMuted": NSNull()]])

let videoView = (self.peersInfos[peerId]?["videoView"])!
let videoSize = (self.peersInfos[peerId]?["videoSize"])!
let isAudioMuted = (self.peersInfos[peerId]?["isAudioMuted"])!

这是用 Swift 1 编写的应用程序的语法,Xcode 8 已将其转换为 Swift 3。它抛出一个错误,说“类型 Any 没有下标值”。我不知道如何解决这个问题,请帮助我!!!

4

2 回答 2

1

首先,即使您的问题已经解决,您在展开可选值错误时也会得到著名的 Unexpectedly found nil,因为声明了可变字典但未初始化。

出现错误类型 Any has no subscript value是因为字典的值是Any默认值,编译器需要知道所有下标对象的静态类型。

该字典peersInfos包含一个嵌套字典,因此将其声明为原生 Swift 类型

var peerIds = [String]()
var peersInfos = [String:[String:Any]]()

然后你可以写

self.peersInfos[peerId] = ["videoView": NSNull(), "videoSize": NSNull(), "isAudioMuted": NSNull(), "isVideoMuted": NSNull()]

if let info = self.peersInfos[peerId] {
    let videoView = info["videoView"]!
    let videoSize = info["videoSize"]!
    let isAudioMuted = info["isAudioMuted"]!
}
于 2017-07-20T15:52:30.617 回答
0

由于在这种情况下您可能希望使用常用的 Swift 字典,因此您应该更改

var peersInfos: NSMutableDictionary!

var peersInfos: [String: Any]!
于 2017-07-20T11:07:23.313 回答