Esistono limitazioni nella scrittura di NSDictionaries nei file in swift. Sulla base di ciò che ho imparato da api docs e this stackoverflow answer, i tipi di chiave dovrebbero essere NSString, e anche i tipi di valore dovrebbero essere di tipo NSx, e Int, String e altri tipi di swift potrebbero non funzionare. La domanda è che se ho un dizionario come: Dictionary<Int, Dictionary<Int, MyOwnType>>
, come posso scriverlo/leggerlo in/da un file plist in swift?Scrittura del dizionario swift su file
11
A
risposta
21
In ogni caso, quando si desidera memorizzare MyOwnType
su file, MyOwnType
deve essere una sottoclasse di NSObject
ed è conforme alle NSCoding
protocollo. in questo modo:
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")
}
}
Poi, ecco il Dictionary
:
var dict = [Int : [Int : MyOwnType]]()
dict[1] = [
1: MyOwnType(name: "foobar"),
2: MyOwnType(name: "bazqux")
]
Così, ecco che arriva la tua domanda:
Scrivendo dizionario veloce su file
Puoi utilizzare NSKeyedArchiver
per scrivere e NSKeyedUnarchiver
per leggere:
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`
Ma nel corpo della tua domanda:
come posso scrivere/leggere a/da un plist file in rapida?
Infatti, NSKeyedArchiver
format is binary plist. Ma se si vuole che il dizionario come valore di plist, è possibile serializzare Dictionary
-NSData
con NSKeyedArchiver
:
// archive to data
let dat:NSData = NSKeyedArchiver.archivedDataWithRootObject(dict)
// unarchive from data
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [Int : [Int : MyOwnType]]
Problemi correlati
- 1. Python: scrittura del dizionario annidato in CSV
- 2. Tipo di dizionario del dizionario generico in Swift
- 3. Scrittura delle funzioni del blocco in Swift
- 4. Scrittura su file (Prolog)
- 5. Swift: Filtro dizionario
- 6. Swift Dizionario confusione
- 7. Chiarimento di Lettura e Scrittura su un C# dizionario
- 8. Scrittura file su cartella temporanea
- 9. Lettura/Scrittura di un dizionario in file csv in python
- 10. Scrittura atomica su file su linux
- 11. Converti dizionario Swift in stringa
- 12. scorrendo un dizionario a Swift
- 13. Scrittura su più descrittori di file
- 14. Scrittura sull'esecuzione del processo 'immagine su Linux
- 15. Convertire Swift dizionario per NSDictionary
- 16. Ordinamento dizionario in Swift 3
- 17. scrittura del modulo nel file .bc bitcode
- 18. Scrittura di un file su sdcard
- 19. usando la mappa su un dizionario in Swift 2, per restituire un dizionario
- 20. Conserva l'ordine degli elementi del dizionario come dichiarato in Swift?
- 21. Swift che accede al dizionario EXIF
- 22. Lettura/scrittura su file utilizzando jQuery
- 23. fopen/fopen_s e scrittura su file
- 24. Scrittura di file su HDFS utilizzando Java
- 25. Scrittura su un file temporaneo in java
- 26. Scrittura su file in modo thread safe
- 27. PowerShell: scrittura su file di testo
- 28. Scrittura su file txt da StringWriter
- 29. scrittura su un file in Clojure
- 30. Scrittura di un QNetworkReply su un file
Grazie mille per la tua risposta dettagliata e grande. Sono nuovo di swift e iOS dev e mi ha aiutato a capire anche le cose correlate :) – AKH
questo scrive un sacco di entità al plist –