Swift 3 升级:类型 'Dictionary<NSObject, AnyObject>?' 没有下标成员

4

最近我将我的应用从Swift 2.3升级到了Swift 3.0,但是当我这么做时,出现了以下错误:

Type 'Dictionary<NSObject, AnyObject>?' has no subscript members

它出现在下面的函数中:

class func getSSIDConnectionName() -> String? {
    var currentSSID: String?
    let interfaces = CNCopySupportedInterfaces()
    if interfaces == nil {
        print("Got nil up here")
        return nil
    }

    let interfaces2:CFArray! = interfaces
    for i in 0..<CFArrayGetCount(interfaces2) {
        let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interfaces2, i)
        let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
        let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString)
        if unsafeInterfaceData != nil {
            let interfaceData = unsafeInterfaceData! as Dictionary!
            currentSSID = interfaceData["SSID"] as? String
        } else {
            print("Got nil down here")
            return nil
        }
    }

return currentSSID
}

我在“current SSID =”这一行代码中遇到了错误。在Swift 2.3版本中,这段代码能够正常工作,然而,我并不擅长处理标记为“unsafe”的操作,如果您的答案涉及到这方面的内容,请尽可能简单易懂地解释一下。
谢谢阅读!
3个回答

7

变更

let interfaceData = unsafeInterfaceData! as Dictionary!

为了

let interfaceData = unsafeInterfaceData! as NSDictionary

原因: unsafeInterfaceData 是一个 CFDictionary。CFDictionary 可以直接强制类型转换为 NSDictionary,因为它们是 toll-free bridged。这足以让我们进行下标操作,所以我们可以使用类似 interfaceData["SSID"] 的表达式。


4

除了@matt说的之外,您的代码可以大大简化, 特别是通过将CNCopySupportedInterfaces()的返回值转换为Swift [String]数组进行强制转换, 并使用可选绑定if let而不是测试nil 和强制解包:

func getSSIDConnectionName() -> String? {

    guard let interfaces = CNCopySupportedInterfaces() as? [String] else {
        return nil
    }
    for ifname in interfaces {
        if let interfaceData = CNCopyCurrentNetworkInfo(ifname as CFString) as? [String: Any],
            let currentSSID = interfaceData["SSID"] as? String {
            return currentSSID
        }
    }
    return nil
}

1

键或下标的数据类型需要 "NSObject"。SWIFT 3似乎强制你将其转换为正确的数据类型。如果你有

currentSSID = interfaceData?[String("SSID") as NSObject] as? String

或者

currentSSID = interfaceData?["SSID" as NSObject] as? String

编译将消失。仅提醒其他答案也可以起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接