Skip to content

Commit fd502e3

Browse files
committed
Initial Commit
0 parents  commit fd502e3

File tree

8 files changed

+191
-0
lines changed

8 files changed

+191
-0
lines changed

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.DS_Store
2+
/.build
3+
/Packages
4+
/*.xcodeproj
5+
xcuserdata/
6+
DerivedData/
7+
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>IDEDidComputeMac32BitWarning</key>
6+
<true/>
7+
</dict>
8+
</plist>

Package.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// swift-tools-version:5.5
2+
3+
import PackageDescription
4+
5+
let package = Package(
6+
name: "ViewModifierBuilder",
7+
platforms: [
8+
.iOS(.v13),
9+
.macOS(.v10_15),
10+
.tvOS(.v13),
11+
.watchOS(.v6)
12+
],
13+
products: [
14+
.library(
15+
name: "ViewModifierBuilder",
16+
targets: ["ViewModifierBuilder"]),
17+
],
18+
targets: [
19+
.target(
20+
name: "ViewModifierBuilder",
21+
dependencies: [],
22+
path: "Sources")
23+
]
24+
)

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# ViewModifierBuilder
2+
3+
[![Swift Package Manager](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat-square)](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat-square)
4+
5+
A [result builder](https://github.com/apple/swift-evolution/blob/main/proposals/0289-result-builders.md) for [ViewModifiers](https://developer.apple.com/documentation/swiftui/viewmodifier/).
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# ``ViewModifierBuilder``
2+
3+
A custom parameter attribute that concatenates many [`ViewModifers`](https://developer.apple.com/documentation/swiftui/viewmodifier).
4+
5+
## Topics
6+
7+
### Applying Modifications
8+
- ``ViewModifierBuilder/ApplyViewModifiers``
9+
10+
### Building Modifications
11+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock()``
12+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:)``
13+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:)``
14+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:_:)``
15+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:_:_:)``
16+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:_:_:_:)``
17+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:_:_:_:_:)``
18+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:_:_:_:_:_:)``
19+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:_:_:_:_:_:_:)``
20+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:_:_:_:_:_:_:_:)``
21+
- ``ViewModifierBuilder/ViewModifierBuilder/buildBlock(_:_:_:_:_:_:_:_:_:_:)``
22+
23+
### Supporting Types
24+
- ``ViewModifierBuilder/ViewModifierBuilder``

Sources/View+Modifiers.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import SwiftUI
2+
3+
extension View {
4+
/// Applies a set of modifiers to a view and returns a new view.
5+
///
6+
/// - Parameters
7+
/// - modifiers: closure returning a modifier
8+
public func modifiers<Modifiers>(@ViewModifierBuilder _ modifiers: () -> Modifiers) -> some View
9+
where Modifiers: ViewModifier {
10+
modifier(ApplyViewModifiers(modifiers))
11+
}
12+
}
13+

Sources/ViewModifierBuilder.swift

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import SwiftUI
2+
3+
/// A custom parameter attribute that concats many ViewModifers.
4+
@resultBuilder public enum ViewModifierBuilder {
5+
6+
/// Builds an empty ViewModifer from a block containing no statements.
7+
@inlinable public static func buildBlock() -> EmptyModifier {
8+
EmptyModifier()
9+
}
10+
11+
/// Passes a single view written as a child view through unmodified.
12+
@inlinable public static func buildBlock<Modifier>(_ modifier: Modifier) -> Modifier
13+
where Modifier: ViewModifier {
14+
modifier
15+
}
16+
17+
@inlinable public static func buildBlock<M0, M1>(_ m0: M0, _ m1: M1) -> some ViewModifier
18+
where M0: ViewModifier, M1: ViewModifier {
19+
m0.concat(m1)
20+
}
21+
22+
@inlinable public static func buildBlock<M0, M1, M2>(_ m0: M0, _ m1: M1, _ m2: M2)
23+
-> some ViewModifier where M0: ViewModifier, M1: ViewModifier, M2: ViewModifier
24+
{
25+
m0.concat(m1).concat(m2)
26+
}
27+
28+
@inlinable public static func buildBlock<M0, M1, M2, M3>(_ m0: M0, _ m1: M1, _ m2: M2, _ m3: M3)
29+
-> some ViewModifier
30+
where M0: ViewModifier, M1: ViewModifier, M2: ViewModifier, M3: ViewModifier {
31+
m0.concat(m1).concat(m2).concat(m3)
32+
}
33+
34+
@inlinable public static func buildBlock<M0, M1, M2, M3, M4>(
35+
_ m0: M0, _ m1: M1, _ m2: M2, _ m3: M3, _ m4: M4
36+
) -> some ViewModifier
37+
where M0: ViewModifier, M1: ViewModifier, M2: ViewModifier, M3: ViewModifier, M4: ViewModifier {
38+
m0.concat(m1).concat(m2).concat(m3).concat(m4)
39+
}
40+
41+
@inlinable public static func buildBlock<M0, M1, M2, M3, M4, M5>(
42+
_ m0: M0, _ m1: M1, _ m2: M2, _ m3: M3, _ m4: M4, _ m5: M5
43+
) -> some ViewModifier
44+
where
45+
M0: ViewModifier, M1: ViewModifier, M2: ViewModifier, M3: ViewModifier, M4: ViewModifier,
46+
M5: ViewModifier
47+
{
48+
m0.concat(m1).concat(m2).concat(m3).concat(m4).concat(m5)
49+
}
50+
51+
@inlinable public static func buildBlock<M0, M1, M2, M3, M4, M5, M6>(
52+
_ m0: M0, _ m1: M1, _ m2: M2, _ m3: M3, _ m4: M4, _ m5: M5, _ m6: M6
53+
) -> some ViewModifier
54+
where
55+
M0: ViewModifier, M1: ViewModifier, M2: ViewModifier, M3: ViewModifier, M4: ViewModifier,
56+
M5: ViewModifier, M6: ViewModifier
57+
{
58+
m0.concat(m1).concat(m2).concat(m3).concat(m4).concat(m5).concat(m6)
59+
}
60+
61+
@inlinable public static func buildBlock<M0, M1, M2, M3, M4, M5, M6, M7>(
62+
_ m0: M0, _ m1: M1, _ m2: M2, _ m3: M3, _ m4: M4, _ m5: M5, _ m6: M6, _ m7: M7
63+
) -> some ViewModifier
64+
where
65+
M0: ViewModifier, M1: ViewModifier, M2: ViewModifier, M3: ViewModifier, M4: ViewModifier,
66+
M5: ViewModifier, M6: ViewModifier, M7: ViewModifier
67+
{
68+
m0.concat(m1).concat(m2).concat(m3).concat(m4).concat(m5).concat(m6).concat(m7)
69+
}
70+
71+
@inlinable public static func buildBlock<M0, M1, M2, M3, M4, M5, M6, M7, M8>(
72+
_ m0: M0, _ m1: M1, _ m2: M2, _ m3: M3, _ m4: M4, _ m5: M5, _ m6: M6, _ m7: M7, _ m8: M8
73+
) -> some ViewModifier
74+
where
75+
M0: ViewModifier, M1: ViewModifier, M2: ViewModifier, M3: ViewModifier, M4: ViewModifier,
76+
M5: ViewModifier, M6: ViewModifier, M7: ViewModifier, M8: ViewModifier
77+
{
78+
m0.concat(m1).concat(m2).concat(m3).concat(m4).concat(m5).concat(m6).concat(m7).concat(m8)
79+
}
80+
81+
@inlinable public static func buildBlock<M0, M1, M2, M3, M4, M5, M6, M7, M8, M9>(
82+
_ m0: M0, _ m1: M1, _ m2: M2, _ m3: M3, _ m4: M4, _ m5: M5, _ m6: M6, _ m7: M7, _ m8: M8,
83+
_ m9: M9
84+
) -> some ViewModifier
85+
where
86+
M0: ViewModifier, M1: ViewModifier, M2: ViewModifier, M3: ViewModifier, M4: ViewModifier,
87+
M5: ViewModifier, M6: ViewModifier, M7: ViewModifier, M8: ViewModifier, M9: ViewModifier
88+
{
89+
m0.concat(m1).concat(m2).concat(m3).concat(m4).concat(m5).concat(m6).concat(m7).concat(m8)
90+
.concat(m9)
91+
}
92+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import SwiftUI
2+
3+
/// Applies set of modifiers to a view and returns a new view.
4+
public struct ApplyViewModifiers<Modifiers>: ViewModifier where Modifiers: ViewModifier {
5+
private let modifiers: Modifiers
6+
7+
/// Structure to apply a set of modifiers to a view.
8+
///
9+
/// - Parameters
10+
/// - modifiers: closure returning a modifier
11+
public init(@ViewModifierBuilder _ modifiers: () -> Modifiers) {
12+
self.modifiers = modifiers()
13+
}
14+
15+
public func body(content: Content) -> some View {
16+
content.modifier(modifiers)
17+
}
18+
}

0 commit comments

Comments
 (0)