在Swift中使用不同类型覆盖超类中的可选属性

时间:2014-08-26 07:44:29

标签: swift override

我正在寻找一种允许从具有不同类型的超类中覆盖可选属性的方法。

如果我测试这样的东西:

protocol protocol1
{
    func testOne()
}

protocol protocol2 : protocol1
{
    func testTwo()
}

class class1
{
    var toto : protocol1?

    init()
    {

    }
}

class class2 : class1
{
    override var toto : protocol2?
}

let test = class2()

我在这行中遇到错误:override var toto : protocol2?

Property 'toto' with type 'protocol2' cannot override a property with type 'protocol1'

我已经谷歌了,我发现了这个post,但它仅用于非可选属性。

1 个答案:

答案 0 :(得分:2)

您所关联的问题中的答案并不符合您的想法。它不会改变协议或超类中定义的属性的类型,只是添加了一个新属性。

Swift(我认为任何面向对象的语言)都不允许重新定义属性的类型,即使新类型是原始类型的子类/子协议。我已经在我对另一个similar question的回答的评论部分中解释过了。

你能做什么?在class中添加新的计算属性,尝试将protocol1向下转换为protocol2,如果不可能则返回nil

class class2 : class1
{
    var toto2: protocol2? {
        if let toto2 = self.toto as? protocol2 {
            return toto2
        } else {
            return nil
        }
    }
}

请注意,为了使向下转换工作,您必须将两个协议定义为objc compatible

@objc protocol protocol1
{
    func testOne()
}

@objc protocol protocol2 : protocol1
{
    func testTwo()
}

在我在游乐场测试的代码下面:

@objc protocol protocol1
{
    func testOne()
}

@objc protocol protocol2 : protocol1
{
    func testTwo()
}

class classFromProtocol1 : protocol1 {
    func testOne() {
    }
}

class classFromProtocol2: protocol2 {
    func testOne() {
    }

    func testTwo() {
    }
}

class class1
{
    var toto : protocol1?

    init()
    {

    }
}

class class2 : class1
{
    var toto2: protocol2? {
        if let toto2 = self.toto as? protocol2 {
            return toto2
        } else {
            return nil
        }
    }
}

let test = class2()
test.toto = classFromProtocol1()
test.toto // prints {classFromProtocol1}
test.toto2 // prints nil, because toto contains an instance of classFromProtocol1

test.toto = classFromProtocol2()
test.toto // prints {classFromProtocol2}
test.toto2 // prints {classFromProtocol2}