AnyTransition.combined()

// 1. AnyTransition([.scale, .opacity, ...])
// 2. .combined(.scale, .opacity, ...)
// 3. AnyTransition(.scale, .opacity, ...)
extension AnyTransition {
    
    // ⭐️ 1. combining transitions
    // AnyTransition([.scale, .opacity, ...]) ........ (1)
    public init(_ transitions: [AnyTransition]) {
        let intialValue = AnyTransition.identity
        // ⭐️ 使用 `reduce(_:_)`
        self = transitions.reduce(intialValue) { (result, transition) in
            result.combined(with: transition)
        }
    }
    
    // ⭐️ 2. when AnyTransition can be inferred, use:
    // .combined(.move, .scale, ...)
    public static func combined(_ transitions: AnyTransition...) -> AnyTransition {
        .init(transitions)
    }
}

extension AnyTransition: ExpressibleByArrayLiteral {
    // ⭐️ 3. convenience init
    // AnyTransition(.move, .scale, .opacity, ...)
    public init(arrayLiteral elements: AnyTransition...) {
        self.init(elements)    // 使用 (1)
    }
}

Last updated

Was this helpful?