There are three libraries provided by the FOSUtilities package: FOSFoundation, FOSMVVM and FOSTesting.
For guides, articles, and API documentation see the library's documentation on the Web or in Xcode.
FOSFoundation is a library of protocols, patterns, types and routines that I have found generally useful in my projects. Support areas include:
- Extensions to URL for one-line REST-Style requests
- Extensions to JSONEncoder and JSONDecoder for single-statement encoding/decoding of Codables
- Along with standardized support for handling various Date and DateTime styles
- ISO 8601
- JSON
- Along with standardized support for handling various Date and DateTime styles
- Extensions to Collection for throttling execution of requests when servers restrict the number of requests per any time period
- Extensions on String such as:
- CamelCase / snake_case conversion
- Hexadecimal String to/from UInt64, Int64, UInt, and Int
- Cleaning and standardizing user-provided input
- Generating random and unique Strings
- Swift Range support
- String obfuscation/revealing (e.g., ROT 13/ROT 47)
For guides, articles, and API documentation see the library's documentation on the Web or in Xcode.
FOSMVVM is a library that implements the Model-View-ViewModel pattern for binding SwiftUI projects to Vapor web services.
For guides, articles, and API documentation see the library's documentation on the Web or in Xcode.
Here is an example of setting up a new Model-View-ViewModel-based client application
public struct LandingPageViewModel: RequestableViewModel {
public typealias Request = LandingPageRequest
@LocalizedString public var pageTitle
public var vmId = ViewModelId()
public init() {}
public static func stub() -> Self { .init() }
}
struct LandingPageView: ViewModelView {
let viewModel: LandingPageViewModel
var body: some View {
VStack {
Text(viewModel.pageTitle)
.font(.headline)
.padding(.bottom, 30)
}
.padding()
}
}
@main
struct MyApp: App {
@State private var viewModel: LandingPageViewModel?
var body: some Scene {
WindowGroup {
let vmBinding = $viewModel
LandingPageView.bind(
viewModel: vmBinding
)
}
.environment(
MVVMEnvironment(
currentVersion: .currentApplicationVersion,
appBundle: Bundle.main,
deploymentURLs: [
.production, .init(serverBaseURL: URL(string: "http://api.mywebserver.com")!),
.staging, .init(serverBaseURL: URL(string: "http://staging-api.mywebserver.com")!),
.debug, .init(serverBaseURL: URL(string: "http://localhost:8080")!)
]
)
)
}
}
public func configure(_ app: Application) async throws {
// uncomment to serve files from /Public folder
// app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
// register routes
try routes(app)
try app.initYamlLocalization(
bundle: Bundle.module,
resourceDirectoryName: "Resources"
)
}
func routes(_ app: Application) throws {
app.routesregister(viewModel: LandingPageViewModel.self)
}
FOSTestingUtilities is a package of testing patterns, types and routines that I have found generally useful in my projects.
For guides, articles, and API documentation see the library's documentation on the Web or in Xcode.
FOSUtilities supports the Swift Package Manager. To include FOSUtilities in your project add the following to your Package.swift file:
.package(url: "[email protected]:foscomputerservices/FOSUtilities.git", branch: "main"),
To use one of the libraries, add one or more entry in the dependencies list of a target in your Package.swift file:
.target(
name: "MyTarget",
dependencies: [
.product(name: "FOSFoundation", package: "FOSUtilities"),
.product(name: "FOSMVVM", package: "FOSUtilities")
// ...
]
),
.testTarget(
name: "MyTests",
dependencies: [
.byName(name: "MyTarget"),
.byName(name: "FOSFoundation"),
.byName(name: "FOSMVVM"),
.byName(name: "FOSTesting"),
.product(name: "Testing", package: "swift-testing")
]
)
All contributions are welcome! Please see CONTRIBUTING.md for more details.
This project is maintained by David Hunt owner of FOS Computer Services, LLC.
FOSUtilities is under the Apache License. See the LICENSE file for more information.