Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中使用不同类型重写超类中的可选属性_Swift_Overriding - Fatal编程技术网

在Swift中使用不同类型重写超类中的可选属性

在Swift中使用不同类型重写超类中的可选属性,swift,overriding,Swift,Overriding,我正在寻找一种方法,允许使用不同类型的超类重写可选属性 如果我测试这样的东西: protocol protocol1 { func testOne() } protocol protocol2 : protocol1 { func testTwo() } class class1 { var toto : protocol1? init() { } } class class2 : class1 { override var to

我正在寻找一种方法,允许使用不同类型的超类重写可选属性

如果我测试这样的东西:

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?

类型为“protocol2”的属性“toto”无法重写类型为“protocol1”的属性。


我已经在谷歌上找到了它,但它只是非可选属性。

你链接的问题的答案与你的想法不符。它不会更改协议或超类中定义的属性的类型,只会添加一个新属性

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

你能做什么?在
中添加一个新的计算属性,该属性尝试将
协议1
向下转换为
协议2
,如果不可能,则返回
nil

class class2 : class1
{
    var toto2: protocol2? {
        if let toto2 = self.toto as? protocol2 {
            return toto2
        } else {
            return nil
        }
    }
}
请注意,为了使向下转换工作,您必须将这两个协议定义为objc兼容

@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}

回答得好!我真的很明白!