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"
那么如果我不能使用泛型类,我怎么能实现呢?
答案 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允许我们在将来声明一个附加了协议的对象。但就目前而言,这是有效的。
希望这有帮助!