仅限View Controller协议无法访问View Controller属性

时间:2019-03-22 03:55:57

标签: ios swift

我有一个@RequestMapping(value = "/save", method = RequestMethod.POST) public String saveUser(Model model, @Validated @ModelAttribute("user") SystemUser user, BindingResult result) { } 专用协议

UIViewController

我有一个带有protocol VCProtocol where Self: UIViewController {} 参数的函数。在函数内部,我无法访问VCProtocol

的任何属性
UIViewController

尽管我可以将协议参数转换为func testFunction(vcProtocol: VCProtocol) { // vcProtocol.view ‼️ error: Value of type 'VCProtocol' has no member 'view' } ,然后像这样访问属性:

UIViewController

是这样吗?我们有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用&运算符来组合协议

protocol VCProtocol where Self: UIViewController {}

func testFunction(vcProtocol: VCProtocol & UIViewController) {
    let view = vcProtocol.view
}

答案 1 :(得分:1)

看来Swift 5已正确支持此功能。您可以尝试使用Xcode 10.2 beta4。对于较早的版本,您将不得不求助于@Ricky Mosolution

protocol VCProtocol: UIViewController {

    func testFunction(vcProtocol: VCProtocol)

}

class A: UIViewController, VCProtocol {

    func testFunction(vcProtocol: VCProtocol) {
        debugPrint(vcProtocol.view)
    }

}

从笔记中

  

协议现在可以将其符合类型限制为   子类化给定的类。支持两种等效形式:

protocol MyView: UIView { /*...*/ } 

protocol MyView where Self: UIView { /*...*/ }
     

Swift 4.2接受了第二种形式,但尚未完全实施   有时可能会在编译时或运行时崩溃。 (SR-5581)   (38077232)