Swift中通过泛型封装可复用视图。

1,331 阅读1分钟

下面会讲一个Demo来介绍一下泛型的很不错的使用场景

假设有一个需求是做一个自动的滚动视图 这里假设是自定义的VScrollView

QQ20210402-175506.gif

后来产品想再做一个下面的滚动视图:

QQ20210402-175740.gif

在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只对泛型简化封装可复用视图的思路做解释,具体语法和代码依据实际项目。

如果想统一配置数据的方法,可以使用协议的方式来实现。