2015-05-21 3 views
-1

У меня есть plist файл, dictionary тип, и пытается прочитать его пункты:'NSDictionary?' не имеет элемент с именем 'Generator'

enter image description here

код в цикле через NSDictionary:

let inputFile = NSBundle.mainBundle().pathForResource("frames", ofType: "plist") 

let inputDataDictionary = NSDictionary(contentsOfFile: inputFile!) 
for inputItem in inputDataDictionary { 
    println(inputItem) 
} 

Но в нем говорится:

'NSDictionary?' does not have a member named 'Generator' 

enter image description here

+2

'inputDataDictionary' является необязательным. Либо развернитесь с помощью '!', Либо используйте 'if let' ... – Alladinian

+0

@ Спасибо всем, спасибо. Отправьте его как новый ответ, пожалуйста. – Maysam

+0

Готово. Рад, что помогло вам. – Alladinian

ответ

2

Проблема заключается в том, что inputDataDictionary является необязательным. Вам придется либо развернуть его через !, либо проверить значение с помощью if let перед перечислением. Также обратите внимание, что рекомендуемый способ итерации словаря - через кортеж. Что-то вроде этого:

if let dict = inputDataDictionary { 
    for (key, value) in dict { 
     println("\(key), \(value)") 
    } 
} 
+1

Альтернативой, если вам не нужен код для обработки, когда значение 'nil' заключается в использовании оператора nil-coalescing с for:' for (k, v) в inputDataDictionary ?? [:] {println ("\ (k), \ (v)")} ' –

+0

@AirspeedVelocity Конечно. Он также мог бы использовать '??' в декларации: 'let inputDataDictionary = NSDictionary (contentsOfFile: inputFile!) ?? [:] ', чтобы обеспечить необязательный экземпляр, хотя в обоих случаях он пропускал любые ошибки (например, путем создания неправильного пути к файлу). – Alladinian

1

Try:

for inputItem in inputDataDictionary.allKeys { 
    println(inputItem) 
} 

Или вы также можете использовать:

for (key, object) in inputDataDictionary { 
    println(key) 
    println(object) 
} 
+0

Я согласен с Дэнни, используя для (ключ, объект) работу! –

+0

Оба дали аналогичные ошибки – Maysam

+0

Странно, я просто проверил тест на игровой площадке, и все работает нормально: 'let inputDataDictionary = NSDictionary (объект: NSObject(), forKey:" test "); для (ключ, объект) in вводDataDictionary { печатьln (ключ); println (объект); } ' Возможно, попробуйте чистую сборку? –

Смежные вопросы