Arrays Swift-将plist文件读取到数组?

Arrays Swift-将plist文件读取到数组?,arrays,swift,file,nsarray,nsbundle,Arrays,Swift,File,Nsarray,Nsbundle,我创建了一个从英语单词到西班牙语单词的迷你翻译。我想使用EnglishHarray.plist而不是我的EnglishHarray=[“猫”]我如何创建它 我还使用了localizable.strings来检索“el gato”的值“the cat”,但我想从englishArray.plist检索这个值 我从这开始,但不确定我是否走上了正确的道路 let path = NSBundle.mainBundle().pathForResource("englishArray", ofType:

我创建了一个从英语单词到西班牙语单词的迷你翻译。我想使用EnglishHarray.plist而不是我的EnglishHarray=[“猫”]我如何创建它

我还使用了localizable.strings来检索“el gato”的值“the cat”,但我想从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

        }
    }
}

对象更改为
数组
,然后

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

这将读取捆绑包中名为“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]
}()

以下是swift 3的解决方案。对于这个解决方案,您不需要更改plist结构中的类型(保持字典、数组不变)。还要注意,由于plist中的数组名称也是englishArray,因此第二个if语句中的(key的值)参数也是englishArray

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)
         }
      }
   }

Swift 4

您可以使用纯swift类型的可编码的

首先从
bundle
加载Plist文件,然后使用
PropertyListDecoder

完整代码-

    func setData() {
        // location of plist file
        if let settingsURL = Bundle.main.path(forResource: "JsonPlist", ofType: "plist") {

            do {
                var settings: MySettings?
                let data = try Data(contentsOf: URL(fileURLWithPath: settingsURL))
                    let decoder = PropertyListDecoder()
                settings = try decoder.decode(MySettings.self, from: data)
                print("array  is \(settings?.englishArray ?? [""])")//prints array  is ["Good morning", "Good afternoon"]


            } catch {
                print(error)
            }
        }
    }
}
struct MySettings: Codable {

    var englishArray: [String]?

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        englishArray = try values.decodeIfPresent([String].self, forKey: .englishArray)

    }
}

Swift 4

最简单的方法是

    let url = Bundle.main.url(forResource: "Sounds", withExtension: "plist")!
    let soundsData = try! Data(contentsOf: url)
    let myPlist = try! PropertyListSerialization.propertyList(from: soundsData, options: [], format: nil)

对象myPlist是一个数组或字典,以用作plist的基础。

根对象myPlist是一个字典。您有两种选择:导入字典或修复plist文件。如果让englishArray=NSArray(contentsofull:url)作为条件转换,为什么不使用条件转换
?[String]{
如果让url=NSBundle.mainBundle().URLForResource(“englishArray”,扩展名为:“plist”),则不需要额外的数组和/或追加
,englishArray=NSArray(contentsOfURL:url)为?[String]{for word in englishArray{print(word)}}
此代码是否放在viewdiload()中对吗?@khoung291如果您需要将数组转换为数据,您可以使用键控archiverI。我不太清楚为什么要将
[String]
数组转换为另一个
[String]
。为什么不将
myEnglishArray=englishFromPlist
改为
for in
?假设您在viewDidLoad()中有此代码,然后如何将myPlist变量共享给其他文件?