🌊 让你的代码流动起来。
这个库为 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