ๆไปฅไฝฟ็จreduce(into:_:)
ๆ่ฆๆณจๆ๏ผใไธๅฎ่ฆ้้ updateAccumulatingResult ไพๆดๆฐ partialResult ใ๏ผๅฆๅๅๅณๅผ ๆๆฏๅไพ็ initialResult โ
Copy // `reduce(_:_:)`
func reduce<Result>(
_ initialResult : Result,
// โญ๏ธ combine function (with return value)
_ nextPartialResult: (Result, Element) throws -> Result
) rethrows -> Result
// `reduce(into:_:)`
func reduce<Result>(
into initialResult: Result,
_ updateAccumulatingResult: (
_ partialResult: inout Result, // โญ๏ธ inout parameter
Self.Element
) throws -> () // โญ๏ธ no return value
) rethrows -> Result
ๆๅ็จๅไฝต SwiftUI ไธญ็ transitions ไพ่ไพ๏ผ่ชชๆ้ๅ
ฉ่
็็จๆณๆๅชไบไธๅใๅจๅไฝต SwiftUI ไธญ็ transitions ๆ๏ผไฝฟ็จ SwiftUI ๅๆ็่ชๆณ๏ผ้กฏๅพๅคช้ๅ้ท๏ผ
Copy AnyTransition
.move(edge: .leading)
.combined(with: .opacity)
.combined(with: .scale)
Copy // ็กๆณ่ช่กๆจๆท (infer) AnyTransition ๅๅฅ็ๆๅ๏ผ
AnyTransition(.move(edge: .leading), .opacity, .scale)
// ๅฏไปฅ่ช่กๆจๆท AnyTransition ๅๅฅ็ๆๅ๏ผ
.combined(.move(edge: .leading), .opacity, .scale)
Copy extension AnyTransition {
// โญ๏ธ combining transitions
// AnyTransition([.scale, .opacity, ...]) ........ (1)
init(_ transitions: [AnyTransition]) {
// use reduce() or reduce(into:)
}
// ่ฎๅฏไปฅไฝฟ็จ็่ชๆณๆด่ฑๅฏ๏ผๅจๅฏไปฅไฝฟ็จ AnyTransition ็ๅฐๆน๏ผ็ดๆฅ็จ๏ผ
// .combined(.move, .scale, ...)
public static func combined(_ transitions: AnyTransition...) -> AnyTransition {
.init(transitions)
}
}
extension AnyTransition: ExpressibleByArrayLiteral {
// convenience init
// AnyTransition(.move, .scale, .opacity, ...)
public init(arrayLiteral elements: AnyTransition...) {
self.init(elements) // ไฝฟ็จ (1)
}
}
่ณๆผ็จ .reduce() ้ๆฏ .reduce(into:)๏ผๅฎๅไน้ๆไฝไธๅ๏ผ่ซ็ไธ้ข็็จๅผ็ขผ๏ผ
Copy init(_ transitions: [AnyTransition]) {
let intialValue = AnyTransition.identity
// โญ๏ธ ไฝฟ็จ `reduce(_:_)`
self = transitions.reduce(intialValue) { (result, transition) in
// โญ๏ธ ไธ้ข็็ตๆๆใ่ชๅๆ็บๆฐ็ `result`ใ๏ผไธ้ๆๅๆนๅฏซ `result`
// ๆไปฅๅฎๆน็จฑ้ๅ้จๅ็ closure ็บ๏ผ`nextPartialResult`ใ
result.combined(with: transition) // โญ๏ธ implicit return
}
}
Copy init(_ transitions: [AnyTransition]) {
var intialValue = AnyTransition.identity
// โญ๏ธ ไฝฟ็จ `reduce(into:_:)`
self = transitions.reduce(into: intialValue) { (result, transition) in
// โญ๏ธ ่จๅพๆๅๆนๅฏซ `result` ่ฎๆธ๏ผๅฆๅๆๆไธฆไธๆ็ดฏๅ ใ
// ๅ ็บๅฆๆๆๅไธๅฏซ `result = ...`๏ผ้ๆ `result` ่ฎๆธ
// ไธฆไธๆ่ชๅๆน่ฎ๏ผๆไปฅๅฎๆน็จฑ้ๅ้จๅ็บ `updateAccumulatingResult`
// ่ไธๆฏ `nextPartialResult`ใ
result = result.combined(with: transition) // โญ๏ธ no return value
}
}