如何使用符合某些协议的属性声明swift类

时间:2014-10-29 08:56:04

标签: swift

swift是否有可能从xib初始化的ViewController类有一个属性,它也是UIViewController的子类并且符合某些协议?

    protocol SomeProtocol {
        // Some methods
    }

    class ViewController: UIViewController {
        // contentView is initialized from xib
        @IBOutlet weak var contentView: UIView!

        // I'd like to declare anotherViewController both conforms to 'SomeProtocol' 
        // and a subclass of UIViewController
        var anotherViewController: UIViewController!
        ...
    }  

当我将ViewController声明为通用类时,请说class ViewController<T: UIViewController, SomeProtocol>,我收到错误:

"Variable in a generic class cannot be presented in Objective-C"

那么如果我不能使用泛型类,我怎么能实现呢?

2 个答案:

答案 0 :(得分:1)

如果我误解了你的问题,请原谅我,但我认为你要做的是声明一个继承自UIViewController并符合SomeProtocol的新类型,如下所示:

protocol SomeProtocol { }

class VCWithSomeProtocol: UIViewController, SomeProtocol {

}

class ViewController: UIViewController {
    var anotherViewController: VCWithSomeProtocol!
}

答案 1 :(得分:0)

所以我希望我也不会误解这个问题,但听起来你可能想要一个多继承对象级别的混合,例如:

let myVC: ViewController, SomeProtocol

不幸的是,Swift并不支持这一点。但是,有一种尴尬的解决方法可能有助于您的目的。

struct VCWithSomeProtocol {
    let protocol: SomeProtocol
    let viewController: UIViewController

    init<T: UIViewController>(vc: T) where T: SomeProtocol {
        self.protocol = vc
        self.viewController = vc
    }
}

然后,无论你需要做什么UIViewController,你都可以访问struct的.viewController方面以及你需要协议方面的任何内容,你可以参考.protocol。

For Instance:

class SomeClass {
   let mySpecialViewController: VCWithSomeProtocol

   init<T: UIViewController>(injectedViewController: T) where T: SomeProtocol {
       self.mySpecialViewController = VCWithSomeProtocol(vc: injectedViewController)
   }
}

现在,只要你需要mySpecialViewController做任何与UIViewController相关的事情,你只需要引用mySpecialViewController.viewController,并且只要你需要它来做一些协议功能,你就引用mySpecialViewController.protocol。

希望Swift 4允许我们在将来声明一个附加了协议的对​​象。但就目前而言,这是有效的。

希望这有帮助!