私は英語の単語からスペイン語の単語へのミニ翻訳を作成しました。 englishArray = ["the cat"]の代わりにenglishArray.plistを使用したいのですが、どうすればこれを作成できますか?
また、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
}
}
}
root
オブジェクトをArray
に変更してから、
var myEnglishArray: [String] = []
if let URL = NSBundle.mainBundle().URLForResource("englishArray", withExtension: "plist") {
if let englishFromPlist = NSArray(contentsOfURL: URL) as? [String] {
myEnglishArray = englishFromPlist
}
}
スウィフト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のベースとして使用したものです。
スウィフト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)
}
}
これにより、バンドル内の「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構造の型を変更する必要はありません(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)
}
}
}