Istnieją ograniczenia związane z pisaniem NSDictionaries do plików w szybkim tempie. Na podstawie tego, czego nauczyłem się od api docs i this stackoverflow answer, typami kluczy powinny być NSString, a typy wartości również powinny być typu NSx, a Int, String i inne typy swift mogą nie działać. Pytanie jest takie, że jeśli mam słownik taki jak: Dictionary<Int, Dictionary<Int, MyOwnType>>
, w jaki sposób mogę go napisać/odczytać z/do pliku plist w swift?Zapisywanie szybkiego słownika do pliku
11
A
Odpowiedz
21
W każdym razie, jeśli chcesz zapisać MyOwnType
do pliku, MyOwnType
musi być podklasą NSObject
i jest zgodny z protokołem NSCoding
. tak:
class MyOwnType: NSObject, NSCoding {
var name: String
init(name: String) {
self.name = name
}
required init(coder aDecoder: NSCoder) {
name = aDecoder.decodeObjectForKey("name") as? String ?? ""
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(name, forKey: "name")
}
}
Następnie tutaj jest Dictionary
:
var dict = [Int : [Int : MyOwnType]]()
dict[1] = [
1: MyOwnType(name: "foobar"),
2: MyOwnType(name: "bazqux")
]
Więc tutaj jest Twoje pytanie:
Pisanie szybki słownika do pliku
Można użyj NSKeyedArchiver
do napisania, a NSKeyedUnarchiver
, aby przeczytać:
func getFileURL(fileName: String) -> NSURL {
let manager = NSFileManager.defaultManager()
let dirURL = manager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false, error: nil)
return dirURL!.URLByAppendingPathComponent(fileName)
}
let filePath = getFileURL("data.dat").path!
// write to file
NSKeyedArchiver.archiveRootObject(dict, toFile: filePath)
// read from file
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as [Int : [Int : MyOwnType]]
// here `dict2` is a copy of `dict`
Ale w ciele zapytanie:
Jak mogę pisać/czytać go do/z plist pliku w systemie SWIFT?
W rzeczywistości NSKeyedArchiver
format is binary plist. Ale jeśli chcesz tego słownika jako wartość plist można szeregować Dictionary
do NSData
z NSKeyedArchiver
:
// archive to data
let dat:NSData = NSKeyedArchiver.archivedDataWithRootObject(dict)
// unarchive from data
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [Int : [Int : MyOwnType]]
Powiązane problemy
- 1. Zapisywanie słownika list do pliku CSV
- 2. Zapisywanie słownika do pliku tekstowego w pythonie
- 3. Alternatywa dla słownika do szybkiego wyszukiwania kluczy?
- 4. Zapisywanie słownika do pliku (alternatywa dla pikle) w Pythonie?
- 5. Zapisywanie QNetworkReply do pliku
- 6. Zapisywanie logów do pliku
- 7. Zapisywanie obrazu do pliku
- 8. zapisywanie wiersza polecenia do pliku
- 9. Zapisywanie wyniku sqlplus do pliku
- 10. Zapisywanie dziennika Androida do pliku
- 11. PowerShell: zapisywanie do pliku tekstowego
- 12. Zapisywanie grid.arrange() działki do pliku
- 13. Zapisywanie pliku wideo do pliku OpenCV
- 14. logowanie do Pythona nie zapisywanie do pliku
- 15. Zapisywanie słownika <String, Int32> w języku C# - Serialization?
- 16. Zapisywanie figury do pliku automatycznie w MATLAB
- 17. Oracle 10g - Zapisywanie wyników zapytań do pliku
- 18. C# - Zapisywanie DataGridView do pliku i ładowanie
- 19. Zapisywanie wektora C++ do pliku wyjściowego
- 20. Atomowe zapisywanie do pliku na Linuksie
- 21. Java - Zapisywanie ciągów do pliku CSV
- 22. Zapisywanie do pliku właściwości nie działa
- 23. Zapisywanie do pliku z wieloprocesowym przetwarzaniem
- 24. Zapisywanie do pliku dziennika w ASP.NET
- 25. Zapisywanie do pliku .txt (UTF-8), python
- 26. Zapisywanie do pliku UTF-8 w Pythonie
- 27. Zapisywanie struct do zmapowanego pliku pamięci (mmap)
- 28. Zapisywanie do pliku w HDFS w Hadoop
- 29. Zapisywanie odpowiedzi z żądań do pliku
- 30. Zapisywanie seq w F # do pliku wyjściowego
Bardzo dziękuję za szczegółową i wielką odpowiedź. Jestem nowy w szybkim i iOS dev i pomógł mi zrozumieć powiązane rzeczy :) – AKH
to pisze wiele podmiotów do plist –