@propertyWrapper final class LazyOnce { var wrappedValue: T { if let existStorage = storage { return existStorage } let newStorage = lazyBlock() self.storage = newStorage return newStorage } private var storage: T? private let lazyBlock: () -> T init(wrappedValue: @escaping @autoclosure () -> T) { self.lazyBlock = wrappedValue } }