2017-01-07 6 views
-2

У меня есть следующий код, который я пытаюсь вставить в Swift 3. Линия super.encodeWithCoder(aCoder) дает проблемы. Все, что я делаю, дает ошибку.кодировка в Swift 3

import Foundation 
class ToDo: Task { 
var done: Bool 

@objc required init(coder aDecoder: NSCoder) { 
    self.done = aDecoder.decodeObjectForKey("done") as! Bool 
    super.init(coder: aDecoder) 
} 

@objc override func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(done, forKey: "done") 
    super.encodeWithCoder(aCoder) 
} 

init(name: String, done: Bool) { 
    self.done = done 
    super.init(name: name) 
} 
} 

Я пытаюсь преобразовать Swift 3

Я это

import Foundation 

class ToDo: Task { 
var done: Bool 

@objc required init(coder aDecoder: NSCoder) { 
    self.done = aDecoder.decodeObject(forKey: "done") as! Bool 
    super.init(coder: aDecoder) 
} 

@objc override func encode(with aCoder: NSCoder) { 
    aCoder.encode(done, forKey: "done") 
    // THis line gives an error 
    super.encode(with aCoder) 

} 

init(name: String, done: Bool) { 
    self.done = done 
    super.init(name: name) 
} 

} 

Линия super.encodeWithCoder(aCoder) выдает ошибку. Swift не дает подсказки, и поиск не дал никаких ответов.

Редактировать в ответ на комментарии Исходный код «super.encodeWithCoder (aCoder)» дает значение ошибки «Task» типа не имеет ни один из членов «» encodeWithCoder

super.encode (с aCoder) дает ошибку Ожидаемое ';' separator

+1

Что такое ошибка? – shallowThought

+0

В то время как странное кодирование, это, скорее всего, потому, что я не знаком с переопределением этого - я всегда думал, что только представления, созданные в IB, используют init (coder :). Тем не менее, две вещи выпрыгивают на меня: (1) Вы не сообщили подробности о том, какую ошибку вы получаете. (2) Я видел ошибку сборки, потому что у вас есть код перед вызовом super.ecode (с помощью: coder). БОНУС: Я только что видел, что ваш код также пропускает двоеточие в этой строке. Я очень уверен, что определенно не буду строить. – dfd

+0

"Линия' super.encodeWithCoder (aCoder) 'дает ошибку". Эта строка не существует в вашем примере Swift 3. Вы имеете в виду ваш вызов 'super.encode (с aCoder)' не скомпилируется? Как указывает dfd, это не будет компилироваться, потому что это должно быть 'super.encode (с: aCoder)'. – Rob

ответ

0

Я думаю, причина, по которой приложение падает, заключается в том, что вы используете функцию decodeObject() для Bool.

Изменение кода для правильных выходов функций:

@objc required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    self.done = aDecoder.decodeBool(forKey: "done") 
} 

@objc override func encode(with aCoder: NSCoder) { 
aCoder.encode(done, forKey: "done") 
} 
+0

Это работает, но я должен был добавить super.init (coder: aDecoder), чтобы не было сообщения об ошибке – cpmac

+0

. У Havent была ошибка, не использующая его O :) – Emptyless

Смежные вопросы