VCore is a Swift collection containing objects, functions, and extensions that I use in my projects.
Package files are grouped as:
-
Views.
Views,UIViews, andUIViewControllers. For instance,SwiftUIBaseButton. -
Models. Models. For instance,
GenericStates andGenericStateModels. -
Services and Managers. Services, managers, and controllers. For instance,
MultiPartFormDataBuilder. -
Helpers. Helper objects and methods. For instance, architectural pattern helpers.
-
Extensions. Extensions.
-
Global Functions. Global functions. For instance,
FIXME(_:)andTODO(_:). -
Macros. Macros. For instance,
CodingKeysGeneration. -
API. Objects used for interfacing from you app/package with
VCore. For instance,VCoreLocalizationManager.
Package incudes folder Extra, which contains:
- XCode Templates. Templates that can be used for accelerating workflow.
Project includes folder Documentation, which contains:
- Various documentation and style guides
Manager that injects a presentation host in view hierarchy for modal presentation.
For additional info, refer to "Presentation Host" documentation.
MultipartFormDataBuilder with a Dictionary-based file API:
let json: [String: Any?] = [
"key": "value"
]
let files: [String: (some AnyMultipartFormDataFile)?] = [
"profile": MultipartFormDataFile(
mimeType: "image/jpeg",
data: profileImage?.jpegData(compressionQuality: 0.25)
),
"gallery": galleryImages?.enumerated().compactMap { (index, image) in
MultipartFormDataFile(
filename: "IMG_\(index).jpg",
mimeType: "image/jpeg",
data: image?.jpegData(compressionQuality: 0.25)
)
}
]
let (boundary, httpData): (String, Data) = try MultipartFormDataBuilder().build(
json: json,
files: files
)
let url: URL = #url("https://somewebsite.com/api/some_endpoint")
var request: URLRequest = .init(url: url)
request.httpMethod = "POST"
try request.addHTTPHeaderFields(
object: MultipartFormDataAuthorizedRequestHeaderFields(
boundary: boundary,
token: "token"
)
)
request.httpBody = httpData.nonEmpty
let (data, response): (Data, URLResponse) = try await URLSession.shared.data(for: request)
...KeychainService that supports custom queries, and has a dedicated property wrapper:
KeychainService.default.getData(key: "SomeKey")
KeychainService.default.setData(key: "SomeKey", value: data)
KeychainService.default.deleteData(key: "SomeKey")@KeychainStorage("AccessToken") var accessToken: String?DigitalTimeFormatter with various configurations:
let formatter: DigitalTimeFormatter = .init()
formatter.string(from: 905048) // "10:11:24:08"AlignedGridLayout that justifies collection of views with an alignment:
private let strings: [String] = [
"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday",
"Sunday"
]
var body: some View {
AlignedGridLayout(alignment: .center, spacing: 5).callAsFunction({
ForEach(strings, id: \.self, content: { string in
Text(string)
.background(content: { Color.accentColor.opacity(0.5) })
})
})
.padding()
}KeyPathInitializableEnumeration that allows for initialization of an enum with a KeyPath:
enum SomeEnum: KeyPathInitializableEnumeration {
case first
case second
var someProperty: Int {
switch self {
case .first: 1
case .second: 2
}
}
}
let value: SomeEnum? = .init(key: \.someProperty, value: 2)Retrieving CGSize form View:
@State private var size: CGSize = .zero
var body: some View {
VStack(content: {
Color.accentColor
.getSize({ size = $0 })
})
}Function that calls fatalError because feature is not implemented:
func didTapContinueButton() {
FIXME()
}Macro that adds CodingKeys to a declaration:
@CodingKeysGeneration
struct GetPostEntity: Decodable {
@CKGProperty("id") let id: Int
@CKGProperty("userId") let userID: Int
@CKGProperty("title") let title: String
@CKGProperty("body") let body: String
var attributes: [String: Any?] = [:]
}
// Generates
internal enum CodingKeys: String, CodingKey {
case id = "id"
case userID = "userId"
case title = "title"
case body = "body"
}Add https://github.com/VakhoKontridze/VCore as a Swift Package in Xcode and follow the instructions.
Package provides limited macOS, tvOS, watchOS, and visionOS support.
Versions with different majors are not directly compatible. When a new major is released, deprecated symbols are removed.
Major. Major changes, such as big overhauls
Minor. Minor changes, such as new objects, functions, and extensions
Patch. Bug fixes and improvements
| Version | Release Date | Swift | SDK | Comment |
|---|---|---|---|---|
| 7.0 | 2024 09 20 |
6.1 (7.5.2 – 7.x.x) 6.0 (7.0.1 - 7.5.1) |
iOS 16.0 macOS 13.0 tvOS 16.0 watchOS 9.0 visionOS 1.0 |
New SDK. API changes. |
| 6.0 | 2024 02 18 |
5.10 (6.0.1 - 6.x.x) 5.9 (6.0.0) |
iOS 15.0 macOS 12.0 tvOS 15.0 watchOS 8.0 visionOS 1.0 |
visionOS support. API changes. |
| 5.0 | 2023 10 08 | 5.9 |
iOS 15.0 macOS 12.0 tvOS 15.0 watchOS 8.0 |
New SDK. API changes. |
| 4.0 | 2022 09 14 |
5.8 (4.7.0 - 4.x.x) 5.7 (4.0.0 - 4.6.1) |
iOS 13.0 macOS 10.15 tvOS 13.0 watchOS 6.0 |
API changes. |
| 3.0 | 2022 05 17 | 5.6 |
iOS 13.0 macOS 10.15 tvOS 13.0 watchOS 6.0 |
Multiplatform support. SPM support. |
| 2.0 | 2021 12 28 | 5.3 | iOS 13.0 | iOS 13.0 support. |
| 1.0 | 2021 10 07 | 5.3 | iOS 14.0 | - |
For additional info, refer to the CHANGELOG.
e-mail: [email protected]