我有一个名为Diary的类,它实现了NScoder,并且有一个成员,它是另一个名为DiaryEntry的类的数组
这是我的日记课程
import Foundation
class Diary: NSObject,NSCoder
{
var dia=[DiaryEntry]()
override init()
{
super.init()
}
func setDiary(ent:DiaryEntry)
{
if(dia.count==0)
{
self.dia.append(ent)
}
else {
for entrie in dia
{
if(entrie==ent)
{
entrie.text+="\n"
entrie.text+=ent.text
break
}
else {
self.dia.append(ent)
}
}
}
}
required init(coder decoder: NSCoder) {
self.dia = decoder.decodeObjectForKey("dia") as [DiaryEntry]
super.init()
}
func encodeWithCoder(encoder: NSCoder) {
encoder.encodeObject(dia, forKey: "dia")
}
}
答案 0 :(得分:4)
Swift 不支持多重继承。 NSCoder
已经继承了NSObject
,因此您的diary
类没有理由尝试继承这两者(这也是不可能的)。
答案 1 :(得分:0)
协议的名称是:NSCoding no NSCoder
答案 2 :(得分:0)
这是一个容易犯的错误;您不小心使用了NSCoder而不是NSCoding。 -er vs -ing
进行解释; NSCoder是一个类,而NSCoding是一个协议。在NSObject之后放置另一个类会使编译器认为您正在请求多个类继承。 Swift目前(从5.x版本开始)不支持多重继承。
在Swift中,您“遵从”协议,因此通过将协议与遵从类基本合并(简化)来绕过多个v表问题(及其引起的所有复杂性和问题)。因此,您可以遵循自己喜欢的协议(当然,在编译器中会施加限制)。
长话短说,您希望您的类从NSObject继承并遵守NSCoding(一种协议),而不是从NSObject和NSCoder继承(这是您无意中告诉编译器要做的事情)。