Как я могу это исправить, если / пусть оператор в функции кодирования? - PullRequest
0 голосов
/ 12 июня 2018
class story: NSObject, NSCoding {

    var label = UILabel()
    var title = String()
    var index = Int()
    var cover = UIImage()
    var frame = CGRect()

    func encode(with aCoder: NSCoder) {
        if let label = label { aCoder.encodeObject(label, forKey: "label") as! UILabel }
        if let title = title { aCoder.encodeObject(title, forKey: "title") }
        if let index = index { aCoder.encodeObject(index, forKey: "index") }
        if let cover = cover { aCoder.encodeObject(cover, forKey: "cover") }
        if let frame = frame { aCoder.encodeObject(frame, forKey: "frame") }
    }

    required convenience init?(coder aDecoder: NSCoder) {
        self.init()
        self.label = aDecoder.decodeObject(forKey: "label") as! UILabel
        self.title = aDecoder.decodeObject(forKey: "title") as! String
        self.index = aDecoder.decodeObject(forKey: "index") as! Int
        self.cover = aDecoder.decodeObject(forKey: "cover") as! UIImage
        self.frame = aDecoder.decodeObject(forKey: "frane") as! CGRect
    }

    func formatStorySize() {
        let newWidth = self.frame.width * 0.8
        let newHeight = self.frame.height * 0.9
        let newX = self.frame.origin.x + newWidth / 2
        let newY = self.frame.origin.y + newHeight / 2

        self.frame = CGRect(x: newX, y: newY, width: newWidth, height: newHeight)
    }

    func addLabel(text: String) -> UILabel {
        let label = UILabel()
        label.backgroundColor = UIColor.white
        label.text = text
        label.textAlignment = .center
        let width = self.frame.width
        let height: CGFloat = 40
        let xPos = self.frame.origin.x
        let yPos = self.frame.origin.y + self.frame.height - height
        label.frame = CGRect(x: xPos, y: yPos, width: width, height: height)
        self.title = label.text!
        return(label)
    }
}

Мне сказали, что для сохранения массива пользовательских экземпляров класса в UserDefaults мне нужно добавить функцию кодирования, а также функцию декодирования.Тем не менее я получаю сообщение об ошибке:

Инициализатор для условного связывания должен иметь тип Optional, а не 'UILabel'

после первой строки в функции кодирования ипохожая ошибка после всех последовательных строк.Что мне нужно изменить?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

При использовании условного связывания, например, if let this = that, that должно быть необязательным.

Используйте var label:UILabel? вместо var label = UILabel()

0 голосов
/ 12 июня 2018

Ни одно из этих свойств не является обязательным, поэтому вам не нужно if let в вашем методе encode.

func encode(with aCoder: NSCoder) {
    aCoder.encode(label, forKey: "label")
    aCoder.encode(title, forKey: "title")
    aCoder.encode(index, forKey: "index")
    aCoder.encode(cover, forKey: "cover")
    aCoder.encode(frame, forKey: "frame")
}

Решив это, вы не должны использовать UserDefaults для сохранения данных.,Запишите закодированные данные в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...