从类NSObject和NSCoder的多重继承的swift错误

时间:2015-04-13 16:57:28

标签: swift

我有一个名为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")
    }
}

3 个答案:

答案 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继承(这是您无意中告诉编译器要做的事情)。