Skip to content

5. SmartCodable Performance

intsig171 edited this page Apr 29, 2025 · 3 revisions
    // 减少动态派发开销,is 检查是编译时静态行为,比 as? 动态转换更高效。
```

fileprivate func didFinishMapping(_ decodeValue: T) -> T { // Properties wrapped by property wrappers don't conform to SmartDecodable protocol. // Here we use PostDecodingHookable as an intermediary layer for processing.

    // 减少动态派发开销,is 检查是编译时静态行为,比 as? 动态转换更高效。
    guard T.self is SmartDecodable.Type else { return decodeValue }
    
    if var value = decodeValue as? SmartDecodable {
        value.didFinishMapping()
        if let temp = value as? T { return temp }
    } else if let value = decodeValue as? PostDecodingHookable {
        if let temp = value.wrappedValueDidFinishMapping() as? T {
            return temp
        }
    }
    return decodeValue
}


用到再换成,避免无用换成。
    /// Creates and stores a snapshot of initial values for a Decodable type
    /// - Parameter type: The Decodable type to cache
    func cacheSnapshot<T>(for type: T.Type) {
        if let object = type as? SmartDecodable.Type {

            let snapshot = DecodingSnapshot()
            // [initialValues] Lazy initialization:
            // Generate initial values via reflection only when first accessed,
            // using the recorded objectType to optimize parsing performance.
            snapshot.objectType = object
            snapshots.append(snapshot)
        }
    }
Clone this wiki locally