美文网首页
Swift中通过泛型封装可复用视图。

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

作者: liaoworkinn | 来源:发表于2021-04-06 10:33 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:Swift中通过泛型封装可复用视图。

          本文链接:https://www.haomeiwen.com/subject/xedskltx.html