L oop через плист в быстром - PullRequest
0 голосов
/ 13 апреля 2020

Эй, ребята, я сейчас пытаюсь l oop через список, который настроен так:

enter image description here

Код I ' используя:

    letterPoints = NSDictionary(contentsOfFile: Bundle.main.path(forResource: "LetterPoints", ofType: "plist")!)

    for (myKey, myValue) in letterPoints {
        for (key, value) in myValue as NSDictionary {
            let x = value["Item 0"] as NSNumber
            let y = value["Item 1"] as NSNumber
            // lastPoint: CGPoint = CGPoint(x: x.integerValue, y: y.integerValue)
            println("x: \(x); y: \(y)")
        }
    }

Однако я получаю сообщение об ошибке в первой строке l oop: for-in l oop требует 'NSDictionary?' соответствовать «последовательности»; Вы хотели развернуть опционально?

Я взял код из l oop через вложенный NSDictionary в plist, используя swift , и, похоже, это тот же структурированный plist, что и мой, поэтому я не уверен почему это не работает. Какой самый лучший способ l oop над моим списком?

1 Ответ

0 голосов
/ 13 апреля 2020

Безопасное развертывание letterPoints с if let:

if let letterPoints = NSDictionary(contentsOfFile: Bundle.main.path(forResource: "LetterPoints", ofType: "plist")!) {
 // Use letterPoints in here
    for (myKey, myValue) in letterPoints {
        // Iterate in here
    }
}

Обратите внимание, что похоже, что у вас есть итератор, использующий неправильные типы. Ваш plist выглядит так, как будто это NSDictionary с String ключами и [NSNumber] значениями. Вы бы повторили это так:

if let letterPoints = NSDictionary(contentsOfFile: Bundle.main.path(forResource: "LetterPoints", ofType: "plist")!) as? [String: [NSNumber]] {
    for (_, myValue) in letterPoints {
        let x = myValue[0]
        let y = myValue[1]
        // lastPoint: CGPoint = CGPoint(x: x.integerValue, y: y.integerValue)
        print("x: \(x); y: \(y)")
    }
}
...