Swift 中优雅的进行链式调用

1,574 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。

Hello, 大家好,今天是我参加11月更文的第 1 天,今天给大家带来的是在 Swift 中优雅的使用链式调用,文章如下:

引言

在日常开发中,使用 Swift 使用链式调用时,会写出以下类似代码:

class Person {
    var id: Int?
    var name: String?
    var age: Int?
    var nickName: String?

    func id(_ id: Int?) -> Person {
        self.id = id
        return self
    }

    func name(_ name: String?) -> Person {
        self.name = name
        return self
    }

    func age(_ age: Int?) -> Person {
        self.age = age
        return self
    }

    func nickName(_ nickName: String?) -> Person {
        self.nickName = nickName
        return self
    }
}

let person = Person().age(18).name("Bob").id(1).nickName("Job")
....

如果只是那么一两个类需要实现链式调用,问题还不是很大,当遇到一个项目里几乎所有的类都需要实现链式调用时,这样写起来,不仅代码量大,而且重复工作太多,耗时耗力,给我们带来非常大的痛苦。

在经历过多次此种痛苦后,终于受不了这种写法,想寻找一个新的、酷的、省力气的实现链式调用的方式,经过一两个小时的探索,终于 CNChainWrapper 诞生了,目前本人已经加入到项目中。

如何使用

1、安装

CocoaPods

在 Podfile 文件中添加下面代码,然后终端执行 pod install

pod 'CNChainWrapper'

Carthage

敬请期待

Swift Package Manager

敬请期待

2、使用

在需要使用的 swift 文件中导入 CNChainWrapper 即可

import CNChainWrapper

想要链式调用时,只需要优先调用 cn 即可,代码如下:

Class

继承自 NSObject 的类

class Student: NSObject {
    var id: Int?
    var name: String?
    var age: Int?
    var nickName: String?
}

let student = Student().cn
    .id(1)
    .name("Bob")
    .nickName("Job")
    .age(18)

省时省力,只需要给类定义好属性即可,不用再为每个属性实现返回类本身的方法

非继承自 NSObject 的类

实现方法与 Struct 类似,遵守 CNChainWrapperCompatible 即可,可参考 Struct

Struct

Struct 需要特殊处理一下,也不难,只需要遵守 CNChainWrapperCompatible 即可, 代码如下:

struct Child: CNChainWrapperCompatible {
    var id: Int?
    var name: String?
    var age: Int?
    var nickName: String?
}

let child = Child().cn
    .id(1)
    .name("Bob")
    .nickName("Job")
    .age(18)

注: enum,目前还没有测试过,等以后需要了再测试~

参考并感谢

  • RxSwiftrx 实现方式,具体文件是 Reactive.swift
  • 掘金 上这位大兄弟的文章。