VCore is a Swift collection containing objects, functions, and extensions that I use in my projects.
Package files are grouped as:
-
Views.
View
s,UIView
s, andUIViewController
s. For instance,SwiftUIBaseButton
. -
Models. Models. For instance,
GenericState
s andGenericStateModel
s. -
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: vakhtang.kontridze@gmail.com