Releases: DevKitOrganization/DevFoundation
1.9.0
1.8.1
This is a small release that fixes a compiler error with Xcode 26.4 RC1.
1.8.0
This release adds helpers for using remote content for localization.
- Create a remote content bundle using
Bundle.makeRemoteContentBundle(at:localizedStrings:) - Set the default remote content bundle using
Bundle.defaultRemoteContentBundle - Access your remote localized strings (with a local fallback) using
#remoteLocalizedString(_:bundle:)and#remoteLocalizedString(format:bundle:_:)
1.7.0
This is a small release that updates ExpiringValue to work better with DateProvider. Specifically, the two initializers spelled ExpiringValue.init(_:lifetimeDuration:) have been updated to include an any DateProvider parameter that defaults to DateProviders.current. The new initializers are spelled ExpiringValue.init(_:dateProvider:lifetimeDuration:).
1.6.0
This release introduces the LiveQuery subsystem, a set of types for managing search-as-you-type functionality and other query-based operations. Live queries automatically handle scheduling, deduplication, and caching as query fragments change.
LiveQueryis anObservabletype that produces results as its query fragment changes. It coordinates between user input and result production, managing debouncing, duplicate removal, and error handling.LiveQueryResultsProduceris a protocol that defines how to generate results for query fragments. Conforming types specify their scheduling strategy and implement result production logic.LiveQuerySchedulingStrategydetermines when results are generated:.passthroughfor immediate results (best for cheap operations like local filtering), or.debounce(_:)to wait for typing to pause (best for expensive operations like network requests).
The live query subsystem is fully thread-safe, Sendable, and integrates seamlessly with SwiftUI through the Observation framework.
1.5.0
This release adds the UserSelection type, a generic structure that manages a user’s selection with a fallback to a default value. This type prioritizes explicit user choices over programmatic defaults while maintaining separate tracking of both values, ensuring user preferences are never accidentally overwritten by programmatic updates to defaults.
1.4.0
We’ve added Duration-based alternatives to all APIs that take a TimeInterval. Specifically,
- We’ve added an overload of
DateProvider.offset(by:)that takes aDuration. - We’ve added an overload of
ExpiringValue.init(_:lifetimeDuration:)that takes aDuration.
1.3.0
- We’ve added a computed property to
DurationspelledtimeInterval, which returns the duration as aTimeInterval. - We’ve updated the internal implementation of
ContextualEventBusObserverto use an actor instead of a class with a dispatch queue. This should have no impact on consumers.
1.2.0
This release introduces the ObservableReference type and updates ExecutionGroup to enable greater flexibility and testability.
- This version updates the minimum supported versions of Apple’s OSes to 26.
ObservableReferenceis a simple reference type that conforms toObservable. This enables easily observing changes to the value.- There are now two variants of
ExecutionGroup.addTask(priority:operation:): the original version for non-throwing operations, and a new version for throwing operations. Both functions now have a generic parameter for the operation’s return type. Together, these changes allow us to return the createdTask, which you can use to monitor its progress, get its result, or cancel it.
1.1.0
This release adds support for initializing SequentialPagers and RandomAccessPagers with loaded pages. Both types’ initializers are now spelled init(pageLoader:loadedPages:). The latter parameter is an array of previously loaded pages that is empty by default.
This change enables more easily using pagers with previously loaded pages. For example, some web services might return the first page of results as part of a larger payload. In such a case, the page could be initialized with that first page, and the page loader will only be required to load subsequent pages.