Swift:为String、Array、Dictionary添加isNotEmpty属性

前言

想要为Swift的String、Array、Dictionary这几种常见类型,添加一个isNotEmpty属性。

灵感来源于Dart中对于判断数组不为空有一个isNotEmpty属性:

final array = [1, 2, 3, 4];
print(array.isNotEmpty);

Dart有,Swift也可以有啊。

直接明了版本

最直接明了的版本当然就是分别给String、Array、Dictionary写分类,在分类中添加一个只读计算属性isNotEmpty即可

String+Extension:

extension String {

    var isNotEmpty: Bool { !isEmpty }

}

Array+Extension:

extension Array {

    var isNotEmpty: Bool { !isEmpty }

}

Dictionary+Extension:

extension Dictionary {

    var isNotEmpty: Bool { !isEmpty }

}

上面3个分类,分别实现了String、Array、Dictionary三个常用类型的isNotEmpty。

但是!!!
你要了解到,有isEmpty属性的类型远不止以上三种类型,难道之后有需求对其他带有isEmpty属性的类型添加isNotEmpty属性,我都要来写一个分类?
这很明显的是没有看透String、Array、Dictionary这些类型的背后,是由什么在支撑着它们可以拥有isEmpty属性。

更本质的版本:

我想说的是入门的时候都会选择直接了当的写法,不过当在反反复复CV代码的时候,我们需要的是观察,归纳,抽离,封装。

请添加图片描述

上图不知道大家注意到没有:

  • Dictionary → Collection
  • Array → MutableCollection → Collection

Array与Dictionary都遵守了Collection协议,那么这个isEmpyt属性会不会就存在于Collection协议中呢?

带着这个疑问,我们去看看Collection协议就知道了:

extension Collection {
    /// A Boolean value indicating whether the collection is empty.
    ///
    /// When you need to check whether your collection is empty, use the
    /// `isEmpty` property instead of checking that the `count` property is
    /// equal to zero. For collections that don't conform to
    /// `RandomAccessCollection`, accessing the `count` property iterates
    /// through the elements of the collection.
    ///
    ///     let horseName = "Silver"
    ///     if horseName.isEmpty {
    ///         print("My horse has no name.")
    ///     } else {
    ///         print("Hi ho, \(horseName)!")
    ///     }
    ///     // Prints "Hi ho, Silver!")
    ///
    /// - Complexity: O(1)
    @inlinable public var isEmpty: Bool { get }
}

上面这段代码,摘自于Swift中的Collection源码,如果仔细看代码注释,会发现,举例说明中是以String的isEmpty进行的,这也说明String类型直接或者间距都遵守Collection协议的。
这么一来就好办了,我只需要在Collection协议的分类中,添加一个isNotEmpty属性即可:

Collection协议的分类判断集合非空

extension Collection {
    /// 判断集合非空
    public var isNotEmpty: Bool {
        return !isEmpty
    }
}

使用:

let array = []
print(array.isNotEmpty)

let dict = [:]
print(dict.isNotEmpty)

let string = ""
print(string.isNotEmpty)

以上代码均可以点出isNotEmpty,并打印true,效果符合预期。

参考文档

Swift 里集合类型协议的关系

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值