Swift 的范型 + 扩展,举例

本文介绍了Swift中范型和扩展的使用,通过6个实际例子展示了如何利用它们来简化代码和确保安全。包括:数据存在与缺失时界面处理、自定义布局、安全的Optional获取、默认值获取、循环调用以及带参数的循环调用,强调了范型和扩展在集合类型的强大力量。

Swift 的范型 + 扩展,

用于集合类型,很强

范型就是模版,Generic + Extension 很适合搞代码简化

本文通过 6 个例子,体现

例子一

实现这种效果

  • 有数据,一个界面

截屏2021-03-18 下午7.32.53.png

  • 没数据,使用默认界面

截屏2021-03-18 下午7.33.01.png


    var array: [String]?
    
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    
        // 没数据,就返回一个,放默认图
        return array.validCount
    }

因为这种界面比较多,逻辑类似,

具体渲染的 Array.Element 是不同的结构体,所以用范型搞代码简化


extension Optional where Wrapped: Collection{

    var validCount: Int{
        var cnt = 1
        if let source = self{
            cnt = max(source.count, cnt)
        }
        return cnt
    }
}


例子 2

承接上文,

  • 有数据,一个界面,采用自定制 layout 型号一

  • 没数据,使用默认界面,采用自定制 layout 型号 2

var array: [String]?


// 没数据,就 false,
layout.oKey = array.hasData

Optioal, 是 Protocol + Generic,

其 value 是 Wrapped,

Wrapped 遵守 Collection,就可以使用 count 方法


extension Optional where Wrapped: Collection{
    var hasData: Bool{
        var has = false
        if let dat = self, dat.count > 0{
            has = true
        }
        return has
    }
}

例子 3, 安全获取, 保证不越界


extension Array {
    func element(at index: Int) -> Element? {
        guard index >= 0, index < count else {
            return nil
        }

        return self[index]
    }
}

例子 4, 默认获取

// 拆包的方式,挺别致
extension Array  {
    func value<T>(at index: Int, emptyAction: () -> T) -> T where Element == T? {
        if let value = self[index] {
            return value
        }
        return emptyAction()
    }
}

例子 5, 循环调用

extension Sequence where Element == () -> Void {
    func callAll() {
        forEach { closure in
            closure()
        }
    }
}

例子 6, 循环带参数调用

extension Sequence {
    func callAll<T>(with input: T) where Element == (T) -> Void {
        forEach { closure in
            closure(input)
        }
    }
}

PS:

一半例子 ,参考自 The power of extensions in Swift

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值