2016-04-23 5 views
3

Я создал мини-перевод с английских слов на испанские слова. Я хотел бы использовать englishArray.plist вместо моего englishArray = ["cat"] Как я могу создать это?Swift - прочитать файл plist массиву?

enter image description here

Я также использовал Localizable.strings для получения значения «кошки» для «Эль Гато», но я хотел бы получить это от englishArray.plist

Я начал с этим но не уверен, если я нахожусь на правильном пути

let path = NSBundle.mainBundle().pathForResource("englishArray", ofType: "plist") 
let plistEnglishArray = NSArray(contentsOfFile: path!) 

Вот остальная часть моего кода:

var englishArray: [String] = ["rainbow", "boots", "heart", "leaf", "umbrella", "tired", "angry", "cry", "the cat" ] 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    self.translateTextField.delegate = self 
    picker.delegate = self 
    picker.dataSource = self 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func translateButtonTapped(sender: UIButton) { 

    let emptyString = self.translateTextField.text 

    if (emptyString!.isEmpty) { 

     print("please enter a word") 

    } 

    for transIndex in englishArray.indices { 
     if englishArray[transIndex] == emptyString!.lowercaseString { 

      //englishArray 

      //translateLabel.text = "\(spanishArray[transIndex])" 
      translateLabel.text = NSLocalizedString(emptyString!.lowercaseString, comment:"") 


      print(emptyString) 
      return 

     } 
    } 
} 
+0

Ваш корневой объект - это словарь. У вас есть два варианта: Импортировать словарь или исправить свой файл plist –

ответ

5

Изменить root объект Array, затем

var myEnglishArray: [String] = [] 
if let URL = NSBundle.mainBundle().URLForResource("englishArray", withExtension: "plist") { 
     if let englishFromPlist = NSArray(contentsOfURL: URL) as? [String] { 
     for myEnglish in englishFromPlist { 
      myEnglishArray.append(myEnglish) 
     } 
     } 
    } 
+0

Почему бы вам просто не бросить свой NSArray с помощью условного литья 'if let englishArray = NSArray (contentsOfURL: url) как? [String] {' –

+0

Спасибо, Лео. Ред. – Khuong

+1

вам не нужен дополнительный массив и/или добавить 'if let url = NSBundle.mainBundle(). URLForResource (" englishArray ", withExtension:" plist "), englishArray = NSArray (contentsOfURL: url) as? [String] { for word in englishArray { print (word) } } ' –

1

Это прочтет ресурс в связке с именем «englishArray.plist» и сохранить его в переменном неизменном english. Это будет необязательно, что вы должны проверить перед использованием.

Он использует закрытие для чтения файла и возвращает массив, это позволяет использовать неизменяемое значение, а не изменяемую переменную, которую можно изменить. Это хорошая идея использовать непреложность, где бы вы ни были, - они способствуют стабильности.

import Foundation 

let english:[String]? = { 
    guard let URL = NSBundle 
    .mainBundle() 
    .URLForResource("englishArray", withExtension: "plist") else { 
     return nil 
    } 
    return NSArray(contentsOfURL: URL) as? [String] 
}() 
1

Вот решение для быстрой 3. Для этого решения вам не нужно менять типы в вашей структуре Plist (держать словарь, массив, как есть). Также обратите внимание, что поскольку имя вашего массива в plist также является английским, поэтому аргумент (значение для ключа) во втором операторе if также является английским.

var myEnglishArray: [String] = [] 
    if let URL = Bundle.main.url(forResource: "englishArray", withExtension: "plist") { 
     guard let englishFromPlist = NSDictionary(contentsOf: URL) else { return [] } 
     if let englishArray = englishFromPlist.value(forKey: "englishArray") as? [String] { 
     for myEnglish in englishArray { 
      myEnglishArray.append(myEnglish) 
     } 
     } 
    } 
Смежные вопросы