Scope
Swift风格的Scoping函数用于提高代码可读性
🌷 用法
apply
,also
,let
,with
,run
返回值
Scope函数之间的区别在于它们返回的结果
apply
和also
返回上下文对象。let
、with
和run
返回闭包结果。
also
和apply
的返回值是上下文对象本身,因此它们可以作为中间步骤包含在调用链中。
let org = Organization()
.also { print("new podo org") }
.apply {
$0.name = "podo"
$0.member = Member(name: "jayce", role: .owner)
}
它们还可以用于返回上下文对象的功能的返回语句中。
func newPodoOrg() -> Organization {
Organization().apply {
$0.name = "podo"
$0.member = Member(name: "jayce", role: .owner)
}
}
apply
对于不返回值且主要操作接收者对象成员的代码块,请使用apply
let org = Organization().apply {
$0.name = "podo"
$0.member = Member(name: "jayce", role: .owner)
}
print(org)
also
对于不改变对象的其他操作,例如记录或打印调试信息,请使用also
let member = Member(name: "jayce", role: .owner)
let org = Organization()
org.also { print("new member") }
.addMember(member)
let
let
可以用来对调用链的结果调用一个或多个函数。
let numbers = [1, 5, 10]
numbers.map { $0 * 2 }
.filter { $0 > 3}
.let { $0.count }
let
通常用于仅在有非nil值时执行代码块。
var org: Organization?
org = Organization(name: "podo", member: Member(name: "jayce", role: .member))
org?.member?.let {
$0.role = .owner // $0 is not nil inside '?.let {}'
}
with
非扩展功能:将上下文对象作为参数传递,返回值是闭包的结果。
with
可以被理解为"使用此对象,执行以下操作。"。
let description = with(org) {
"Orgnaization name is \($0.name), "
.appending("member name is \($0.member.name)")
}
print(description)
run
使用run
作为非扩展功能。非扩展的run
允许你在需要表达式的地方执行多个语句的代码块。
let hexNumberRegex = run { () -> Regex in
let digits = "0-9"
let hexDigits = "A-Fa-f"
let sign = "+-"
return Regex("[\(sign)]?[\(digits)\(hexDigits)]+")
}
⚙️ 安装
-
import PackageDescription let package = Package( name: "MyApp", dependencies: [ .package(url: "https://github.com/hb1love/Scope", .upToNextMajor(from: "2.1.0")) ] )
-
使用 CocoaPods
pod 'Scope'
👮 许可证
范围可使用MIT许可证获得。有关详细信息,请参阅LICENSE。