当试图在NSUserDefaults,Swift中存储数组时,获取"没有实现methodSignatureForSelector"?

sna*_*ggs 33 swift

我尝试存储对象数组NSUserDefaults.

我有以下代码片段:

    var accounts = MyAccounts()
    var array:Array<MyAccounts.MyCalendar> =  accounts.populateFromCalendars()

    NSUserDefaults.standardUserDefaults().
          setObject(array, forKey: "test_storeAccounts_array") // <- get error here
    NSUserDefaults.standardUserDefaults().synchronize()
Run Code Online (Sandbox Code Playgroud)

但是我得到了例外:

does not implement methodSignatureForSelector: -- trouble ahead
Run Code Online (Sandbox Code Playgroud)

我的班级结构:

class MyAccounts {

   /* ... */

    class MyCalendar {
        var title:String?
        var identifier:String?
        var email:String?
        var calType:String?
        var isActive:Bool?
        var isMainAcount:Bool?

        init(){}
    }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

mah*_*ega 80

确保您的类继承自NSObject

class MyAccounts:NSObject {

   /* ... */

    class MyCalendar {
        var title:String?
        var identifier:String?
        var email:String?
        var calType:String?
        var isActive:Bool?
        var isMainAcount:Bool?

        init(){}
    }
}
Run Code Online (Sandbox Code Playgroud)


Him*_*jan 16

我在Swift 3.0中遇到了这个异常.在我的例子中,我的模型类不是从NSObject基类继承的.只是从NSObject基类继承我的类并实现NSCoding协议(如果你的容器数组有自定义对象)

  class Stock: NSObject, NSCoding {

      var stockName: String?

      override init() {
      }

      //MARK: NSCoding protocol methods
      func encode(with aCoder: NSCoder){
          aCoder.encode(self.stockName, forKey: "name")
      }

      required init(coder decoder: NSCoder) {

          if let name = decoder.decodeObject(forKey: "name") as? String{
               self.stockName = name
          }
      }

      func getStockDataFromDict(stockDict stockDict:[String:AnyObject]) -> Stock {

           if let  stockName = stockDict["name"] {
                self.stockName = stockName as? String
           }

           return self
       }
   }
Run Code Online (Sandbox Code Playgroud)


Ant*_*ong 1

您需要将类转换为NSData第一个。像这样的东西:

var data = NSKeyedArchiver.archivedDataWithRootObject(accounts.populateFromCalendars())

var userDefaults = NSUserDefaults.standardUserDefaults();
userDefaults.setObject(data, forKey: "test_storeAccounts_array"); 
Run Code Online (Sandbox Code Playgroud)