如何通过特定类型的类符合斯威夫特协议?(How to make Swift protocol con

2019-11-04 17:55发布

我在斯威夫特写了一个协议:

protocol FooDelegate{
    titleImage:UIImage? {get}
}

我想,以确保符合它的类必须是一个UITableViewController类型。

换一种说法:

// ViewController conform FooDelegate is OK,Because ViewController 
// is inherit from UITableViewController!
class ViewController:UITableViewController,FooDelegate /* compile ok */{

}

// OtherVC is failed to conform FooDelegate,Because it is not inherit
// from UITableViewController.
class OtherVC:UIViewController,FooDelegate /* will compile error */{

}

怎么做?

我改变FooDelegate的定义如下:

protocol FooDelegate where Self:UITableViewController {
    var titleImage:UIImage? {get}
}

但它似乎并没有工作。

*修正部分*:使用自助:是的UITableViewController OK!

但是,当我写下面编译时,错误的是:

class StubClass{
    var delegate:FooDelegate!

    func invoke(){
        let idxSet = ...
        delegate.tableView.reloadSections(idxSet, with: .none) //Error:Value of type 'FooDelegate' has no member 'tableView'
    }
}

请看看这个错误线之上。 这难道没有委托任何的tableView财产? 委托符合FooDelegate,并FooDelegate使自我:的UITableViewController,和的UITableViewController必须的tableView财产?? !!

什么是错在这里??? 谢谢 :)

Answer 1:

由于tableView财产是不是该协议的声明可见你只需要添加tableView在协议属性。 事情是这样的:

@objc protocol FooDelegate where Self: UITableViewController {
    var tableView: UITableView { get }
}

class SimpleTableView: UITableViewController, FooDelegate {

}

let delegate: FooDelegate? = SimpleTableView()

delegate?.tableView.reloadData()

Remeber添加@objc在协议声明。



Answer 2:

尝试这个:

protocol FooDelegate: class where Self: UITableViewController {
    // code
}

如果你想一定通过扩展可访问UITableViewController

protocol FooDelegate {
    // code
}

extension FooDelegate where Self: UITableViewController {
    // code
}


文章来源: How to make Swift protocol conformed by a specific kind of Class?