Flow

Build & Test

🌊 让你的代码流动起来。

这个库为 Swift 提供了一系列扩展方法,以实现更好的流畅语法。这种风格对于某些可以链式调用(组合)的操作非常有用。

功能

.then

使用 .then 内联执行对象配置。 它将闭包中的语句应用于该对象。在定义对象时设置其属性非常有用。

let label = UILabel().then {
  $0.text = "Hello"
  $0.textColor = .red
  $0.font = .preferredFont(forTextStyle: .largeTitle)
  $0.sizeToFit()
}

let size = CGSize().then {
	$0.width = 20
}

提供了此方法的两个重载。一个适用于 AnyObject(即类),另一个适用于 Any(适用于值类型)。编译器会适当地选择正确的重载。

灵感来源

.mutate

原地修改一个值。它类似于 .then,但应用于 self 而不是新副本。该值需要定义为 var

view.frame.mutate {
  $0.origin.y = 200
  $0.size.width = 300
}

这应该只用于值类型。 对于引用类型,建议使用 .then

.let

您可以将 .let 视为一个 map 操作,但适用于所有类型(不仅仅是 *Functors*)。 它允许您将对象转换为另一种类型的对象。

let dateString: String = Date().let {
    let formatter = DateFormatter()
    return formatter.string(from: $0)
}

它对于基于初始化程序的类型转换特别有效

let number: Int? = "42".let(Int.init)

当您可以直接使用点语法时,请勿过度使用此方法。 您可以使用它来访问对象的成员 Date().let { $0.timeIntervalSince1970 },但这与 Date().timeIntervalSince1970 相同。

灵感来源

.do

使用此方法对同一个对象执行多个操作(副作用)。它有助于减少多次输入相同名称的冗长性。

UserDefaults.standard.do {
    $0.set(42, forKey: "number")
    $0.set("hello", forKey: "string")
    $0.set(true, forKey: "bool")
}

如果您放弃返回值,则此方法与其他方法类似,但最好使用 do 来更好地传达意图。 它还可以让您避免在某些情况下编写 return

灵感来源

.debug

默认情况下,它将 self 打印到控制台。 此方法对于调试方法调用链的中间值非常有用。

let result = Object()
   .then { ... }
   .debug("prefix")
   .let { ... }
   .debug()

自由函数 with

使用对象执行闭包。当您无法使用该方法或者如果您喜欢自由函数风格时,此自由函数是 .then 的替代方法。

let label = with(UILabel()) {
    $0.text = "Hello"
    $0.textColor = .red
    $0.font = .preferredFont(forTextStyle: .largeTitle)
    $0.sizeToFit()
}

灵感来源

自由函数 withLet

with 的变体,允许您返回不同的类型。 它是 let 的自由函数替代方案。

自由函数 run

执行语句的闭包,当您需要一个表达式时非常有用。 这就像创建一个闭包并立即调用它,但有时使用特定名称会更清晰。

let result = run { ... } // same as { ... }()

灵感来源

支持的类型

由于 Swift 不允许我们扩展像 Any 这样的非命名类型,因此我们需要使每种类型都符合 Flowable 协议。

该库为许多标准库、Foundation 和 UIKit 类型提供了开箱即用的依从性。 请参阅 Conformances.swift 以获取完整列表。

您可以通过扩展自己使任何类型都符合该协议

extension YourType: Flowable {}

请注意,您可以使用自由函数变体,而无需类型符合该协议。

灵感来源

作者

Alejandro Martinez | https://alejandromp.com | @alexito4