模糊地使用'下标' - NSMutableDictionary

时间:2016-02-02 20:37:36

标签: ios swift dictionary

我的代码在2015年5月的Swift版本中完美运行,当时我编写了应用程序。当我今天打开XCode 7.2时,我得到一个奇怪的错误信息我无法理解:模糊地使用'下标'。总的来说,我在我的代码中得到了16次这个错误,有人知道我可以改变什么来解决这个问题吗?

if let path = NSBundle.mainBundle().pathForResource("colorsAndAlternatives", ofType: "plist") {
    if let dict = NSMutableDictionary(contentsOfFile: path) {
        let randomNumber = Int(arc4random_uniform(UInt32(numberOfOptions)))
        let correctColor = "#" + String(dict["\(randomNumber)"]![1] as! Int!, radix: 16, uppercase: true) // Ambiguous use of 'subscript'

correctColor由HEX使用以下代码确定:https://github.com/yeahdongcn/UIColor-Hex-Swift/blob/master/HEXColor/UIColorExtension.swift

2 个答案:

答案 0 :(得分:3)

Swift编译器现在要严格得多。

在这里,它并不确定dict["\(randomNumber)"]的结果是什么类型,所以它保释并要求精确。

帮助编译器理解结果是一个Ints数组,并且您可以使用下标来访问它,例如:

if let result = dict["\(randomNumber)"] as? [Int] {
    let correctColor = "#" + String(result[1], radix: 16, uppercase: true)
}

答案 1 :(得分:2)

我试图解开正在发生的事情:

if let path = NSBundle.mainBundle().pathForResource("colorsAndAlternatives", ofType: "plist") {
    if let dict = NSMutableDictionary(contentsOfFile: path) {

        let randomNumber = Int(arc4random_uniform(UInt32(numberOfOptions)))

        let numberKey = "\(randomNumber)"

        if let val = dict[numberKey] as? [AnyObject] { // You need to specify that this is an array
            if let num = val[1] as? NSNumber { // If your numbers are coming from a file, this is most likely an array of NSNumber objects, since value types cannot be stored in an NSDictionary
                let str = String(num.intValue, radix: 16, uppercase: true) // construct a string with the intValue of the NSNumber

                let correctColor = "#" + str
            }
        }
    }
}