🌊 让你的代码流动起来。
这个库为 Swift 提供了一系列扩展方法,以实现更好的流畅语法。这种风格对于某些可以链式调用(组合)的操作非常有用。
.then
用于配置引用类型和值类型。在初始化时进行配置非常有用。
.mutate
用于原地修改值类型。
.let
用于将一个对象转换为另一个对象。
.do
用于对同一个对象执行多个操作。
提供自由函数变体,适用于您喜欢这种语法或不想遵循协议的情况
with
(类似于 .then
)withLet
(类似于 .let
)run
作为立即执行闭包的替代方案。
使用 .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
(适用于值类型)。编译器会适当地选择正确的重载。
self
的引用,如果是值类型,则获得 inout
副本。灵感来源
原地修改一个值。它类似于 .then
,但应用于 self
而不是新副本。该值需要定义为 var
。
view.frame.mutate {
$0.origin.y = 200
$0.size.width = 300
}
self
的 inout
引用。这应该只用于值类型。 对于引用类型,建议使用
.then
。
您可以将 .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
相同。
self
的引用。灵感来源
let
声明。使用此方法对同一个对象执行多个操作(副作用)。它有助于减少多次输入相同名称的冗长性。
UserDefaults.standard.do {
$0.set(42, forKey: "number")
$0.set("hello", forKey: "string")
$0.set(true, forKey: "bool")
}
如果您放弃返回值,则此方法与其他方法类似,但最好使用 do
来更好地传达意图。 它还可以让您避免在某些情况下编写 return
。
self
的引用。灵感来源
默认情况下,它将 self
打印到控制台。 此方法对于调试方法调用链的中间值非常有用。
let result = Object()
.then { ... }
.debug("prefix")
.let { ... }
.debug()
self
的引用。使用对象执行闭包。当您无法使用该方法或者如果您喜欢自由函数风格时,此自由函数是 .then
的替代方法。
let label = with(UILabel()) {
$0.text = "Hello"
$0.textColor = .red
$0.font = .preferredFont(forTextStyle: .largeTitle)
$0.sizeToFit()
}
self
的 inout
副本的引用。灵感来源
with
或 using
函数。with
的变体,允许您返回不同的类型。 它是 let
的自由函数替代方案。
执行语句的闭包,当您需要一个表达式时非常有用。 这就像创建一个闭包并立即调用它,但有时使用特定名称会更清晰。
let result = run { ... } // same as { ... }()
灵感来源
由于 Swift 不允许我们扩展像 Any
这样的非命名类型,因此我们需要使每种类型都符合 Flowable
协议。
该库为许多标准库、Foundation 和 UIKit 类型提供了开箱即用的依从性。 请参阅 Conformances.swift 以获取完整列表。
您可以通过扩展自己使任何类型都符合该协议
extension YourType: Flowable {}
请注意,您可以使用自由函数变体,而无需类型符合该协议。
with
或 using
函数的语言。Alejandro Martinez | https://alejandromp.com | @alexito4