下面会讲一个Demo来介绍一下泛型的很不错的使用场景
假设有一个需求是做一个自动的滚动视图 这里假设是自定义的VScrollView
类
后来产品想再做一个下面的滚动视图:
灰色的滚动视图在OC中我们比较常用的是解决方案是把内部具体UI布局的UIVIew封装成一个类,然后传入到支持滚动的View中。
OC中不使用泛型的写法: 下面是伪代码
/// 负责管理滚动的父视图
class VScrollView: UIView {
var topView: UIView
var bottomView: UIView
func configBaseUI() {
// 添加topView和bottomView。
}
func scroll() {
// 视图向上滚动
}
}
/// 第一个GIF中 橘黄色 左边图片右边文字的视图
class YellowItemView: UIView {
/// 内部布局代码略
}
// 使用
let vScrollView = VScrollView()
vScrollView.topView = YellowItemView()
vScrollView.bottomView = YellowItemView()
vScrollView.configBaseUI()
// 开始滚动视图
vScrollView.scroll()
/// 第二个GIF中 灰色 只有文字的视图
class GrayItemView: UIView {
/// 内部布局代码略
}
// 具体使用同YellowItemView,略。
在Swift中我们可以通过泛型
去统一处理两种视图, 只有在调用的时候才考虑具体类型。
class VScrollView<T: UIView>: UIView {
var topView: T
var bottomView: T
override init(frame: CGRect) {
super.init(frame: .zero)
configBaseUI()
}
func configBaseUI() {
// 添加topView和bottomView。
addSubView(topView)
addSubView(bottomView)
}
func scroll() {
// 视图向上滚动
}
}
// 具体使用
let yellowVScrollView = GymNewMarqueeView<YellowItemView>()
yellowVScrollView.scroll()
let grayVScrollView = GymNewMarqueeView<GrayItemView>()
yellowVScrollView.scroll()
Demo只对泛型简化封装可复用视图的思路做解释,具体语法和代码依据实际项目。
如果想统一配置数据的方法,可以使用协议的方式来实现。
网友评论