web-dev-qa-db-ja.com

Swift-plistファイルを配列に読み取りますか?

私は英語の単語からスペイン語の単語へのミニ翻訳を作成しました。 englishArray = ["the cat"]の代わりにenglishArray.plistを使用したいのですが、どうすればこれを作成できますか?

enter image description here

また、localizable.stringsを使用して「elgato」の値「thecat」を取得しましたが、これを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

        }
    }
}
10
Miguel

rootオブジェクトをArrayに変更してから、

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

スウィフト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のベースとして使用したものです。

9
Paul Linsay

スウィフト4

Codableを使用できます。これは純粋な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)

    }
}
6
Jack

これにより、バンドル内の「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]
}()
0
user887210

Swift 3の解決策は次のとおりです。この解決策では、plist構造の型を変更する必要はありません(Dictionary、Arrayはそのままにします)。また、配列の名前はplistにあるので注意してください。もenglishArrayであるため、2番目のifステートメントの(キーの値)引数も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)
         }
      }
   }
0
Ohmy