2014-09-28 48 views
2

我在NSCoding上發現了這黑色的代碼,它幾乎確實希望我想要它。下面是我找到它的鏈接。 如何在其他類中創建NSCoding類和用戶?下面的代碼不會工作。我希望有人能幫助我。SWIFT如何創建NSCoding子類並從另一個類中調用它?

import Foundation 
import UIKit 


class User: NSObject, NSCoding { 
    var name: String 

    init(name: String) { 
     self.name = name 
    } 

    required init(coder aDecoder: NSCoder) { 

     self.name = aDecoder.decodeObjectForKey("name") as String 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(name, forKey: "name") 
    } 
} 


//new class where I want to set and get the object 

class MyNewClass: UIViewController { 

    let user = User(name: "Mike") 
    let encodedUser = NSKeyedArchiver.archivedDataWithRootObject(user) 
    let decodedUser = NSKeyedUnarchiver.unarchiveObjectWithData(encodedUser) as User 

} 

//http://stackoverflow.com/questions/24589933/nskeyedunarchiver-fails-to-decode-a-custom-object-in-swift 

回答

3

我從下面的自己的項目中剪切和粘貼。我已經限制這一個字符串參數存儲到文件。但你可以有更多的不同類型。您可以將其粘貼到一個swift文件中,並將其用作ViewController以及添加的要測試的類。它演示使用NSCoding和swift語法來保存和檢索對象中的數據。

import UIKit 
import Foundation 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var instanceData = Data() 
     instanceData.name = "testName" 
     ArchiveData().saveData(nameData: instanceData) 
     let retrievedData = ArchiveData().retrieveData() as Data 
     println(retrievedData.name) 

    } 
} 

class Data: NSObject { 

    var name: String = "" 

    func encodeWithCoder(aCoder: NSCoder!) { 
     aCoder.encodeObject(name, forKey: "name") 
    } 

    init(coder aDecoder: NSCoder!) { 
     name = aDecoder.decodeObjectForKey("name") as String 
    } 

    override init() { 
    } 
} 

class ArchiveData:NSObject { 

    var documentDirectories:NSArray = [] 
    var documentDirectory:String = "" 
    var path:String = "" 

    func saveData(#nameData: Data) { 
     documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
     documentDirectory = documentDirectories.objectAtIndex(0) as String 
     path = documentDirectory.stringByAppendingPathComponent("data.archive") 

     if NSKeyedArchiver.archiveRootObject(nameData, toFile: path) { 
      //println("Success writing to file!") 
     } else { 
      println("Unable to write to file!") 
     } 
    } 

    func retrieveData() -> NSObject { 
     var dataToRetrieve = Data() 
     documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
     documentDirectory = documentDirectories.objectAtIndex(0) as String 
     path = documentDirectory.stringByAppendingPathComponent("data.archive") 
     if let dataToRetrieve2 = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? Data { 
      dataToRetrieve = dataToRetrieve2 as Data 
     } 
     return(dataToRetrieve) 
    } 
} 
+0

感謝這是我正在尋找。 – LearningGuy 2014-09-28 22:18:40

相關問題