Swift - Как кодировать строку длиной более 512 символов? - PullRequest
0 голосов
/ 13 октября 2018

В моем приложении я хочу сохранить массив моего пользовательского класса UserSavedTextElement.Это работает довольно хорошо, но когда я хочу сохранить строку, которая содержит более 512 символов, приложение вылетает с ошибкой:

Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

Мой пользовательский класс:

import Foundation


class UserSavedTextElement: NSObject, NSSecureCoding {

static var supportsSecureCoding: Bool = true

   func encode(with aCoder: NSCoder) {
       aCoder.encode(title, forKey: "title")
       aCoder.encode(text, forKey: "text")
   }

   var title: String
   var text: String

   init(newTitle: String, newText: String){
       self.title = newTitle
       self.text = newText
   }

   required init(coder aDecoder: NSCoder) {
       self.title = aDecoder.decodeObject(forKey: "title") as! String
       self.text = aDecoder.decodeObject(forKey: "text") as! String
   }

}

Для сохранения массива я использую:

    do{
        let textData = try NSKeyedArchiver.archivedData(withRootObject: textArray, requiringSecureCoding: true)
        UserDefaults.standard.set(textData, forKey: "spokenTextHistory")
        print("saved")
    }catch{
        print("not saved")
    }

Также, если строка содержит более 512 символов, печатается: "сохранено "

Мой код для загрузки массива (AppDelegate - didFinishLaunchingWithOptions):

    let textData = UserDefaults.standard.object(forKey: "spokenTextHistory") as? NSData

    if let textData = textData {
        do{
            let textDataArray = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, UserSavedTextElement.self], from: textData as Data) as? [UserSavedTextElement]
            if let textDataArray1 = textDataArray {
                textArray = textDataArray1
            }
        }catch{
            print(error)
        }
    }

Он разбивает на эту строку:

self.text = aDecoder.decodeObject(forKey: "text") as! String

Массивв котором данные, которые должны быть сохранены, объявляются так:

var textArray:[UserSavedTextElement] = []

Если это важно: строка, которая должна быть сохранена, исходит из UITextView

Как я могу сохранить больше, чем512 символов?

...