Skip to content

Commit b6d7890

Browse files
authored
Increase the Swift version to 6.0 (#13)
* Increase the Swift version to 6.0 * Add the `@retroactive` attribute * Update `ci.yml` * Fix `nonisolated(unsafe)` properties depending on the Swift version * Update `CHANGELOG.md` * Refactor unit tests for the UI module * Update `ci.yml`
1 parent 93fd649 commit b6d7890

11 files changed

Lines changed: 164 additions & 60 deletions

File tree

.github/workflows/ci.yml

Lines changed: 64 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ jobs:
3434
fail-fast: false
3535
matrix:
3636
include:
37+
- xcode: "Xcode_16.0"
38+
runsOn: macOS-14
39+
name: "macOS 14, Xcode 16.0, Swift 6.0"
40+
- xcode: "Xcode_15.4"
41+
runsOn: macOS-14
42+
name: "macOS 14, Xcode 15.4, Swift 5.10"
3743
- xcode: "Xcode_15.0"
3844
runsOn: macos-13
3945
name: "macOS 13, Xcode 15.0, Swift 5.9.0"
@@ -44,16 +50,12 @@ jobs:
4450
- uses: actions/checkout@v3
4551
- name: ${{ matrix.name }}
4652
run: xcodebuild test -scheme "Validator-Package" -destination "platform=macOS" clean -enableCodeCoverage YES -resultBundlePath "test_output/${{ matrix.name }}.xcresult" || exit 1
47-
- name: Upload coverage reports to Codecov
48-
uses: codecov/codecov-action@v3.1.0
53+
- name: Upload test coverage reports to Codecov
54+
uses: space-code/oss-common-actions/.github/actions/upload_test_coverage_report@main
4955
with:
56+
scheme_name: Typhoon
57+
filename: ${{ matrix.name }}
5058
token: ${{ secrets.CODECOV_TOKEN }}
51-
xcode: true
52-
xcode_archive_path: test_output/${{ matrix.name }}.xcresult
53-
- uses: actions/upload-artifact@v4
54-
with:
55-
name: ${{ matrix.name }}
56-
path: test_output
5759

5860
iOS:
5961
name: ${{ matrix.name }}
@@ -65,6 +67,18 @@ jobs:
6567
fail-fast: false
6668
matrix:
6769
include:
70+
- destination: "OS=18.1,name=iPhone 16 Pro"
71+
name: "iOS 18.1"
72+
xcode: "Xcode_16.1"
73+
runsOn: macOS-14
74+
- destination: "OS=18.0,name=iPhone 16 Pro"
75+
name: "iOS 18.0"
76+
xcode: "Xcode_16.0"
77+
runsOn: macOS-14
78+
- destination: "OS=17.5,name=iPhone 15 Pro"
79+
name: "iOS 17.5"
80+
xcode: "Xcode_15.4"
81+
runsOn: macOS-14
6882
- destination: "OS=17.0.1,name=iPhone 14 Pro"
6983
name: "iOS 17.0.1"
7084
xcode: "Xcode_15.0"
@@ -92,6 +106,18 @@ jobs:
92106
fail-fast: false
93107
matrix:
94108
include:
109+
- destination: "OS=18.1,name=Apple TV"
110+
name: "tvOS 18.1"
111+
xcode: "Xcode_16.1"
112+
runsOn: macOS-14
113+
- destination: "OS=18.0,name=Apple TV"
114+
name: "tvOS 18.0"
115+
xcode: "Xcode_16.0"
116+
runsOn: macOS-14
117+
- destination: "OS=17.5,name=Apple TV"
118+
name: "tvOS 17.5"
119+
xcode: "Xcode_15.4"
120+
runsOn: macOS-14
95121
- destination: "OS=17.0,name=Apple TV"
96122
name: "tvOS 17.0"
97123
xcode: "Xcode_15.0"
@@ -104,16 +130,12 @@ jobs:
104130
- uses: actions/checkout@v3
105131
- name: ${{ matrix.name }}
106132
run: xcodebuild test -scheme "Validator-Package" -destination "${{ matrix.destination }}" clean -enableCodeCoverage YES -resultBundlePath "test_output/${{ matrix.name }}.xcresult" || exit 1
107-
- name: Upload coverage reports to Codecov
108-
uses: codecov/codecov-action@v3.1.0
133+
- name: Upload test coverage reports to Codecov
134+
uses: space-code/oss-common-actions/.github/actions/upload_test_coverage_report@main
109135
with:
136+
scheme_name: Typhoon
137+
filename: ${{ matrix.name }}
110138
token: ${{ secrets.CODECOV_TOKEN }}
111-
xcode: true
112-
xcode_archive_path: test_output/${{ matrix.name }}.xcresult
113-
- uses: actions/upload-artifact@v4
114-
with:
115-
name: ${{ matrix.name }}
116-
path: test_output
117139

118140
watchOS:
119141
name: ${{ matrix.name }}
@@ -125,6 +147,18 @@ jobs:
125147
fail-fast: false
126148
matrix:
127149
include:
150+
- destination: "OS=11.1,name=Apple Watch Series 10 (46mm)"
151+
name: "watchOS 11.1"
152+
xcode: "Xcode_16.1"
153+
runsOn: macOS-14
154+
- destination: "OS=11.0,name=Apple Watch Series 10 (46mm)"
155+
name: "watchOS 11.0"
156+
xcode: "Xcode_16.0"
157+
runsOn: macOS-14
158+
- destination: "OS=10.5,name=Apple Watch Series 9 (45mm)"
159+
name: "watchOS 10.5"
160+
xcode: "Xcode_15.4"
161+
runsOn: macOS-14
128162
- destination: "OS=10.0,name=Apple Watch Series 9 (45mm)"
129163
name: "watchOS 10.0"
130164
xcode: "Xcode_15.0"
@@ -137,16 +171,12 @@ jobs:
137171
- uses: actions/checkout@v3
138172
- name: ${{ matrix.name }}
139173
run: xcodebuild test -scheme "Validator-Package" -destination "${{ matrix.destination }}" clean -enableCodeCoverage YES -resultBundlePath "test_output/${{ matrix.name }}.xcresult" || exit 1
140-
- name: Upload coverage reports to Codecov
141-
uses: codecov/codecov-action@v3.1.0
174+
- name: Upload test coverage reports to Codecov
175+
uses: space-code/oss-common-actions/.github/actions/upload_test_coverage_report@main
142176
with:
177+
scheme_name: Typhoon
178+
filename: ${{ matrix.name }}
143179
token: ${{ secrets.CODECOV_TOKEN }}
144-
xcode: true
145-
xcode_archive_path: test_output/${{ matrix.name }}.xcresult
146-
- uses: actions/upload-artifact@v4
147-
with:
148-
name: ${{ matrix.name }}
149-
path: test_output
150180

151181
spm:
152182
name: ${{ matrix.name }}
@@ -158,10 +188,16 @@ jobs:
158188
fail-fast: false
159189
matrix:
160190
include:
161-
- name: "Xcode 15"
191+
- name: "macOS 14, SPM 6.0.2 Test"
192+
xcode: "Xcode_16.1"
193+
runsOn: macOS-14
194+
- name: "macOS 14, SPM 6.0.0 Test"
195+
xcode: "Xcode_16.0"
196+
runsOn: macOS-14
197+
- name: "macOS 14, SPM 5.9.0 Test"
162198
xcode: "Xcode_15.0"
163-
runsOn: macos-13
164-
- name: "Xcode 14"
199+
runsOn: macos-14
200+
- name: "macOS 13, SPM 5.8.1 Test"
165201
xcode: "Xcode_14.3.1"
166202
runsOn: macos-13
167203
steps:
@@ -186,7 +222,7 @@ jobs:
186222

187223
discover-typos:
188224
name: Discover Typos
189-
runs-on: macOS-12
225+
runs-on: macOS-13
190226
env:
191227
DEVELOPER_DIR: /Applications/Xcode_14.1.app/Contents/Developer
192228
steps:

.swiftlint.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ excluded:
33
- Package.swift
44
- Package@swift-5.7.swift
55
- Package@swift-5.8.swift
6+
- Package@swift-5.9.swift
7+
- Package@swift-5.10.swift
68
- .build
79

810
# Rules
@@ -131,4 +133,4 @@ nesting:
131133
type_name:
132134
max_length:
133135
warning: 40
134-
error: 50
136+
error: 50

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
# Change Log
22
All notable changes to this project will be documented in this file.
33

4+
## [Unreleased]
5+
6+
#### Added
7+
- Increase the Swift version to 6.0.
8+
- Added in Pull Request [#13](https://github.com/space-code/validator/pull/13).
9+
410
#### 1.x Releases
511
- `1.0.x` Releases - [1.0.0](#100) | [1.0.1](#101)
612

Mintfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
nicklockwood/SwiftFormat@0.47.12
2-
realm/SwiftLint@0.47.1
1+
nicklockwood/SwiftFormat@0.54.0
2+
realm/SwiftLint@0.55.1

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version: 5.9
1+
// swift-tools-version: 6.0
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription

Package@swift-5.10.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// swift-tools-version: 5.10
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "Validator",
8+
platforms: [
9+
.iOS(.v16),
10+
.macOS(.v13),
11+
.watchOS(.v9),
12+
.tvOS(.v16),
13+
.visionOS(.v1),
14+
],
15+
products: [
16+
.library(name: "ValidatorCore", targets: ["ValidatorCore"]),
17+
.library(name: "ValidatorUI", targets: ["ValidatorUI"]),
18+
],
19+
dependencies: [],
20+
targets: [
21+
.target(name: "ValidatorCore", dependencies: []),
22+
.target(name: "ValidatorUI", dependencies: ["ValidatorCore"]),
23+
.testTarget(name: "ValidatorCoreTests", dependencies: ["ValidatorCore"]),
24+
.testTarget(name: "ValidatorUITests", dependencies: ["ValidatorCore", "ValidatorUI"]),
25+
]
26+
)

Package@swift-5.9.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// swift-tools-version: 5.9
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "Validator",
8+
platforms: [
9+
.iOS(.v16),
10+
.macOS(.v13),
11+
.watchOS(.v9),
12+
.tvOS(.v16),
13+
.visionOS(.v1),
14+
],
15+
products: [
16+
.library(name: "ValidatorCore", targets: ["ValidatorCore"]),
17+
.library(name: "ValidatorUI", targets: ["ValidatorUI"]),
18+
],
19+
dependencies: [],
20+
targets: [
21+
.target(name: "ValidatorCore", dependencies: []),
22+
.target(name: "ValidatorUI", dependencies: ["ValidatorCore"]),
23+
.testTarget(name: "ValidatorCoreTests", dependencies: ["ValidatorCore"]),
24+
.testTarget(name: "ValidatorUITests", dependencies: ["ValidatorCore", "ValidatorUI"]),
25+
]
26+
)

Sources/ValidatorCore/Classes/Extensions/String+IValidationError.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55

66
import Foundation
77

8+
#if hasFeature(RetroactiveAttribute)
9+
extension String: @retroactive Error {}
10+
#endif
11+
12+
// MARK: - String + IValidationError
13+
814
extension String: IValidationError {
915
public var message: String { self }
1016
}

Sources/ValidatorUI/Classes/IUIValidatable.swift

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
// Copyright © 2023 Space Code. All rights reserved.
44
//
55

6-
// swiftlint:disable prefixed_toplevel_constant
7-
86
import Foundation
97
import ValidatorCore
108

119
// MARK: - IUIValidatable
1210

11+
@MainActor
1312
public protocol IUIValidatable: AnyObject {
1413
associatedtype Input
1514

@@ -38,27 +37,36 @@ public protocol IUIValidatable: AnyObject {
3837
func validateOnInputChange(isEnabled: Bool)
3938
}
4039

41-
private var kValidationRules: UInt8 = 0
42-
private var kValidationHandler: UInt8 = 0
40+
#if swift(>=5.10)
41+
private nonisolated(unsafe) var kValidationRules: UInt8 = 0
42+
private nonisolated(unsafe) var kValidationHandler: UInt8 = 0
43+
44+
// swiftlint:disable:next prefixed_toplevel_constant
45+
private nonisolated(unsafe) let validator = Validator()
46+
#else
47+
private var kValidationRules: UInt8 = 0
48+
private var kValidationHandler: UInt8 = 0
4349

44-
private let validator = Validator()
50+
// swiftlint:disable:next prefixed_toplevel_constant
51+
private let validator = Validator()
52+
#endif
4553

4654
public extension IUIValidatable {
4755
@discardableResult
48-
func validate<T>(rule: some IValidationRule<T>) -> ValidationResult where T == Input {
56+
func validate(rule: some IValidationRule<Input>) -> ValidationResult {
4957
let result = validator.validate(input: inputValue, rule: rule)
5058
validationHandler?(result)
5159
return result
5260
}
5361

5462
@discardableResult
55-
func validate<T>(rules: [any IValidationRule<T>]) -> ValidationResult where T == Input {
63+
func validate(rules: [any IValidationRule<Input>]) -> ValidationResult {
5664
let result = validator.validate(input: inputValue, rules: rules)
5765
validationHandler?(result)
5866
return result
5967
}
6068

61-
func add<T>(rule: some IValidationRule<T>) where T == Input {
69+
func add(rule: some IValidationRule<Input>) {
6270
validationRules.append(rule)
6371
}
6472

@@ -81,7 +89,7 @@ public extension IUIValidatable {
8189
objc_getAssociatedObject(self, &kValidationHandler) as? ((ValidationResult) -> Void)
8290
}
8391
set {
84-
if let newValue = newValue {
92+
if let newValue {
8593
objc_setAssociatedObject(self, &kValidationHandler, newValue as AnyObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
8694
}
8795
}

Sources/ValidatorUI/Classes/SUI/Extensions/View+Validation.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
// Copyright © 2023 Space Code. All rights reserved.
44
//
55

6-
// swiftlint:disable prefixed_toplevel_constant
7-
86
import SwiftUI
97
import ValidatorCore
108

11-
private let validator = Validator()
9+
#if swift(>=5.10)
10+
// swiftlint:disable:next prefixed_toplevel_constant
11+
private nonisolated(unsafe) let validator = Validator()
12+
#else
13+
// swiftlint:disable:next prefixed_toplevel_constant
14+
private let validator = Validator()
15+
#endif
1216

1317
public extension View {
1418
/// Validate a binding item using a set of validation rules and perform an action based on

0 commit comments

Comments
 (0)