获得;不实现methodSignatureForSelector“;当尝试在NSUserDefaults中存储数组时,Swift?

获得;不实现methodSignatureForSelector“;当尝试在NSUserDefaults中存储数组时,Swift?,swift,Swift,我尝试将对象数组存储在NSUserDefaults中 我有以下代码片段: var accounts = MyAccounts() var array:Array<MyAccounts.MyCalendar> = accounts.populateFromCalendars() NSUserDefaults.standardUserDefaults(). setObject(array, forKey: "test_storeAccoun

我尝试将对象数组存储在
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()

我的班级结构:

class MyAccounts {

   /* ... */

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

        init(){}
    }
}

有什么想法吗?

您需要先将类转换为
NSData
。大概是这样的:

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

var userDefaults = NSUserDefaults.standardUserDefaults();
userDefaults.setObject(data, forKey: "test_storeAccounts_array"); 

确保您的类继承自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(){}
    }
}

在Swift 2中,我在自定义类中使用通知模式时遇到了类似的错误。请注意,当在ViewController类中实现相同的通知(观察)时,它不会抱怨。它只使用自定义类,该类是从Swift文件创建的,没有子类化该错误被抛出

class myClass : NSObject {
      override init(){
            super.init()
            NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("functionCall:"), name: "NotificationName", object: nil)
        }

    //Implement function
    func functionCall(notification: NSNotification) {

    //Extract the object and implement the function
    }
    }

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


如果数组的类型为
NSMutableArray
,则它将起作用。我有自定义的
数组
。得到同样的错误。顺便说一句,我从评论中读到了你的答案对不起,我删除了评论,因为我后来意识到它是为一个不同的问题写的。
class myClass : NSObject {
      override init(){
            super.init()
            NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("functionCall:"), name: "NotificationName", object: nil)
        }

    //Implement function
    func functionCall(notification: NSNotification) {

    //Extract the object and implement the function
    }
    }
  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
       }
   }