Swift3 将Swift 1语法改写为Swift 3-“;类型Any没有下标值“;

Swift3 将Swift 1语法改写为Swift 3-“;类型Any没有下标值“;,swift3,syntax,skylink,Swift3,Syntax,Skylink,这是用Swift 1编写的应用程序的语法,Xcode 8已将其转换为Swift 3。它抛出一个错误,说“type Any没有下标值”。我不知道如何解决这个问题,请帮助我 在这种情况下,您可能需要使用常用的Swift字典,因此应该更改 var peerIds = [String]() var peersInfos: NSMutableDictionary! self.peersInfos.addEntries(from: [peerId: ["videoView": NSNull(), "vid

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

在这种情况下,您可能需要使用常用的Swift字典,因此应该更改

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"])!


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

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

字典
peersinfo
包含嵌套字典,因此将其声明为本机Swift类型

var peersInfos: [String: Any]!
然后你就可以写了

var peerIds = [String]()
var peersInfos = [String:[String:Any]]()
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"]!
}