Cocoa에서 Swift 로의 다운 캐스팅에 대한 질문이 많았고 몇 가지 버그가 있다는 것을 알고 있지만 여기에서 찾은 많은 방법을 시도했지만 누군가가 도움을 줄 수 있기를 바라면서 작동하도록 할 수 없습니다.
저는 프로그래밍이 처음입니다. iOS 용 데이터베이스 프로그램을 신속하게 만들고 있습니다.
개인 클래스가 있습니다.
class Person : NSObject {
var firstName : String
var lastName : String
init (firstName : String, lastName : String) {
self.firstName = firstName
self.lastName = lastName
}
func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeObject(firstName, forKey:"firstName")
aCoder.encodeObject(lastName, forKey:"lastName")
}
init (coder aDecoder: NSCoder!) {
self.firstName = aDecoder.decodeObjectForKey("firstName") as String
self.lastName = aDecoder.decodeObjectForKey("lasName") as String
}
}
내 뷰 컨트롤러의 맨 위에 클래스 배열을 선언합니다.
var peopleArray = [Person]()
그런 다음 샘플 사용자를 선언하여 배열을 채우고 배열에 추가합니다.
var nateB = Person(firstName: "Nate", lastName: "Birkholz")
var nateC = Person(firstName: "Nate", lastName: "Carson")
var nateD = Person(firstName: "Nate", lastName: "Donnelly")
self.peopleArray.append(nateB)
self.peopleArray.append(nateC)
self.peopleArray.append(nateD)
그런 다음 데이터를 plist 파일에 저장하려고합니다.
let fileManager = (NSFileManager.defaultManager())
let directorys : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
println("value of directorys is \(directorys)")
if (directorys != nil){
let directories:[String] = directorys!;
let pathToFile = directories[0]; //documents directory
let plistfile = "PeopleArray.plist"
let plistpath = pathToFile.stringByAppendingPathComponent(plistfile);
if !fileManager.fileExistsAtPath(plistpath){ //writing Plist file
self.createInitialPeople()
println("Declaring cocoaArray")
var cocoaArray : NSArray = [NSKeyedArchiver.archivedDataWithRootObject(peopleArray)]
println("writing to path")
cocoaArray.writeToFile(plistpath, atomically: true)
let tellMe = cocoaArray.writeToFile(plistpath, atomically: true)
println("Return of write is \(tellMe)")
}
이해할 수없는 데이터가 포함 된 Plist 파일이 생성됩니다.
앱을 닫고 다시 시작한 다음 파일로드를 시도합니다.
else {
println("\n\nPlist file found at \(plistpath)")
let cocoaArray = NSMutableArray.arrayWithContentsOfFile(plistpath)
peopleArray = cocoaArray as Array
}
}
"AnyObject는 'Person'과 동일하지 않습니다. 여기에 나열된 것을 여러 가지 방법으로 다운 캐스팅 해 보았지만 성공적으로 수행 할 수 없습니다. 이것은 정말 실망 스럽습니다.
최종 코드로 업데이트 :
func createPeoplePlist() {
let fileManager = (NSFileManager.defaultManager())
let directorys : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
println("value of directorys is \(directorys)")
if (directorys != nil){
let directories:[String] = directorys!;
let pathToFile = directories[0]; //documents directory
let plistfile = "PeopleArray.plist"
plistpath = pathToFile.stringByAppendingPathComponent(plistfile);
if !fileManager.fileExistsAtPath(plistpath){ //writing Plist file
self.createInitialPeople()
println("Saving to Plist")
[NSKeyedArchiver.archiveRootObject(peopleArray, toFile: plistpath)]
println("writing to path \(plistpath)")
} else { //Reading Plist file
println("\n\nPlist file found at \(plistpath)")
peopleArray = NSKeyedUnarchiver.unarchiveObjectWithFile(plistpath) as [Person]
}
}
}
배열을 NSData
다시 읽을 때 (처음에 아카이브 할 때 생성 한 데이터) 여전히 포함 됩니다. 그러나 디스크에 쓰기 전에 데이터를 다른 어레이에 넣는 이유에 대해 의문을 제기합니다. peopleArray
그 자체가 루트 객체가 될 수 있습니다. 그것을 감싸는 추가 배열이 필요하지 않습니다. 그런 다음 간단히 archiveRootObject(_:toFile:)
및 unarchiveObjectWithFile(_:)
.
또한 자세한 정보 는 Archives and Serializations Programming Guide 및 Property List Programming Guide 및 NSKeyedArchiver 문서를 읽는 것이 좋습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다