ios - Swift 中的协议(protocol)继承 + 委托(delegate)

标签 ios swift

我有一个有代表的类(class)。我创建了一个子类,它也有一个委托(delegate)。我想让用于第二个委托(delegate)的协议(protocol)扩展用于第一个委托(delegate)的协议(protocol):

protocol MySuperClassProtocol {
    func foo()
}

class MySuperClass {
    var delegate:MySuperClassProtocol?
}

protocol MySubClassProtocol:MySuperClassProtocol {
    func bar()
}

class MySubClass: MySuperClass {
    override var delegate:MySubClassProtocol? // compiler error - "cannot override..."

    func test() {
        delegate?.foo()
        delegate?.bar()
    }
}

class UserClass:MySubClassProtocol {
    func foo() {
        println("foo!")
    }
    func bar() {
        println("bar")
    }
} 

有办法解决吗?我看到的唯一可能的解决方案是使这两个协议(protocol)相互独立,并使用不同的名称。像这样:

protocol MySuperClassProtocol {
    func foo()
}

class MySuperClass {
    var mySuperClassDelegate:MySuperClassProtocol?
}

protocol MySubClassProtocol {
    func bar()
}

class MySubClass: MySuperClass {
    var mySubClassDelegate:MySubClassProtocol?

    func test() {
        mySuperClassDelegate?.foo()
        mySubClassDelegate?.bar()
    }
}

class UserClass:MySuperClassProtocol, MySubClassProtocol {
    func foo() {
        println("foo!")
    }
    func bar() {
        println("bar")
    }
}

但这看起来有点奇怪 + 不允许我使用委托(delegate)的命名约定 - “delegate”。

最佳答案

抱歉发布了 necroposting,我找到的唯一解决方案是:

protocol SuperClassDelegate {
    func first_method()
}

class SuperClass {
    var delegate: SuperClassDelegate?

    func do_something() {
        delegate?.first_method()
    }
}

protocol SubClassDelegate: SuperClassDelegate {
    func second_method()
}

class SubClass: SuperClass {
    private var subDelegate: SubClassDelegate?
    override var delegate: SuperClassDelegate? {
        get { return self.subDelegate }
        set { self.subDelegate = newValue as! SubClassDelegate? }
    }

    //override func do_something() {
    //  super.do_something()
    //  subDelegate?.second_method()
    //}

    func do_something_other() {
        //subDelegate?.first_method()
        self.do_something()
        subDelegate?.second_method()
    }
}

class InheritanceAndDelegation: SubClassDelegate {
    let obj = SubClass()

    init() {
        obj.delegate = self
    }

    internal func first_method() {
        print("Hello from SuperClass")
    }

    internal func second_method() {
        print("Hello from SubClass")
    }

    func check() {
        obj.do_something_other()
    }
}

let inheritanceAndDelegation = InheritanceAndDelegation()
inheritanceAndDelegation.check()
//prints:
//Hello from SuperClass
//Hello from SubClass

注释代码也可以。希望它对某人有用。

关于ios - Swift 中的协议(protocol)继承 + 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29058814/

相关文章:

ios - Swift:在文档目录中创建 csv 文件

iphone - Scrollview 在dismissViewControllerAnimated 后没有滚动

ios - Objective-C/iOS -- 根据外部数据不同触发的类设计

objective-c - 如何在 swift 中导入 Objective c 文件

swift - 完成处理程序问题

swift - Swift 协议(protocol)元类型的运行时比较

ios - UICollectionView 单元格不保留数据 --- 如何使它们的数据持久化?

objective-c - 有没有办法删除日期选择器的 "year"?

ios - 快速自定义类初始化

swift - 在 Playground 或项目外快速联网?