给定一个泛型类型的结构,我想限制哪些方法只能调用泛型类型的子类型。
struct ViewBuilder<T:UIView> {
let parent:UIView
func createView() -> UIView {
let view = UIView()
parent.addSubview(view)
return view
}
}
extension ViewBuilder where T:UIButton {
func createButton() -> UIButton {
let button = UIButton()
parent.addSubview(button)
return button
}
}
在这段代码中,我指定构建器应该只创建UIControls
:
let builder = ViewBuilder<UIControl>(parent:UIView())
let view = builder.createView() // ok
let button = builder.createButton() // 'UIControl' is not a subtype of 'UIButton'
但是,如您所见,我得到了相反的行为;aUIView
不是a ;_ UIControl
一个UIButton
是一个UIControl
。有什么方法可以在 Swift 中做到这一点?(我使用的是 Swift 4。)我使用泛型和协议尝试了几件事,但没有运气。
(我理解为什么上面的代码会以它的方式工作,但如果存在整体问题,我正在寻找替代方案。如果有人能提出一个好的解决方案,也许我可以改进这个问题以适应。)