Подтвердить что ты не робот

Get "не реализует методSignatureForSelector" при попытке сохранить массив в NSUserDefaults, 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()

Но я получаю исключение:

does not implement methodSignatureForSelector: -- trouble ahead

моя структура класса:

class MyAccounts {

   /* ... */

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

        init(){}
    }
}

Любые идеи?

4b9b3361

Ответ 1

Убедитесь, что ваш класс наследуется от 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(){}
    }
}

Ответ 2

Я получал это исключение в 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
       }
   }

Ответ 3

Сначала вам нужно преобразовать класс в NSData. Что-то вроде этого:

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

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

Ответ 4

В Swift 2 я столкнулся с подобной ошибкой при использовании шаблона Notification в пользовательском классе. Обратите внимание, что, когда одно и то же уведомление (Observe) реализовано в классе 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
    }
    }