Skip to content

Commit 8ff6c45

Browse files
authored
Merge pull request #171 from 0xLeif/develop
2.2.0
2 parents fc3c90a + 54733f4 commit 8ff6c45

File tree

4 files changed

+57
-47
lines changed

4 files changed

+57
-47
lines changed

Sources/SwiftUIKit/Containers/HStack.swift

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,16 @@
66
//
77

88
import UIKit
9-
import Later
109

1110
/// Horizontal StackView
1211
@available(iOS 9.0, *)
1312
public class HStack: UIView {
14-
deinit {
15-
views.resign()
16-
}
17-
1813
private var spacing: Float
1914
private var padding: Float
2015
private var alignment: UIStackView.Alignment
2116
private var distribution: UIStackView.Distribution
2217
/// The views that the HStack contains
23-
public lazy var views = Contract<[UIView]>(initialValue: [])
24-
.onChange { [weak self] (views) in
25-
Later.main {
26-
self?.draw(views: views ?? [])
27-
}
28-
}
18+
private(set) var views = [UIView]()
2919

3020
/// Create a HStack
3121
/// - Parameters:
@@ -44,8 +34,8 @@ public class HStack: UIView {
4434
self.alignment = alignment
4535
self.distribution = distribution
4636
super.init(frame: .zero)
47-
views.value = closure()
48-
draw(views: views.value ?? [])
37+
views = closure()
38+
draw(views: views)
4939
}
5040

5141
/// Create a HStack that accepts an array of UIView?
@@ -65,9 +55,9 @@ public class HStack: UIView {
6555
self.alignment = alignment
6656
self.distribution = distribution
6757
super.init(frame: .zero)
68-
views.value = closure()
58+
views = closure()
6959
.compactMap { $0 }
70-
draw(views: views.value ?? [])
60+
draw(views: views)
7161
}
7262

7363
required init?(coder aDecoder: NSCoder) {
@@ -82,4 +72,11 @@ public class HStack: UIView {
8272
distribution: distribution)
8373
{ views }
8474
}
75+
76+
public func update(views closure: (inout [UIView]) -> Void) -> Self {
77+
closure(&views)
78+
draw(views: views)
79+
80+
return self
81+
}
8582
}

Sources/SwiftUIKit/Containers/VStack.swift

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,12 @@ import Later
1111
/// Vertical StackView
1212
@available(iOS 9.0, *)
1313
public class VStack: UIView {
14-
deinit {
15-
views.resign()
16-
}
17-
1814
private var spacing: Float
1915
private var padding: Float
2016
private var alignment: UIStackView.Alignment
2117
private var distribution: UIStackView.Distribution
2218
/// The views that the VStack contains
23-
public lazy var views = Contract<[UIView]>()
24-
.onChange { [weak self] (views) in
25-
Later.main {
26-
self?.draw(views: views ?? [])
27-
}
28-
}
19+
private(set) var views = [UIView]()
2920

3021
/// Create a VStack
3122
/// - Parameters:
@@ -44,8 +35,8 @@ public class VStack: UIView {
4435
self.alignment = alignment
4536
self.distribution = distribution
4637
super.init(frame: .zero)
47-
views.value = closure()
48-
draw(views: views.value ?? [])
38+
views = closure()
39+
draw(views: views)
4940
}
5041

5142
/// Create a VStack that accepts an array of UIView?
@@ -65,9 +56,9 @@ public class VStack: UIView {
6556
self.alignment = alignment
6657
self.distribution = distribution
6758
super.init(frame: .zero)
68-
views.value = closure()
59+
views = closure()
6960
.compactMap { $0 }
70-
draw(views: views.value ?? [])
61+
draw(views: views)
7162
}
7263

7364
required init?(coder aDecoder: NSCoder) {
@@ -82,4 +73,12 @@ public class VStack: UIView {
8273
distribution: distribution)
8374
{ views }
8475
}
76+
77+
@discardableResult
78+
public func update(views closure: (inout [UIView]) -> Void) -> Self {
79+
closure(&views)
80+
draw(views: views)
81+
82+
return self
83+
}
8584
}

Sources/SwiftUIKit/Views/ContractView.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@ import Later
1212
public class ContractView<View, Value>: UIView where View: UIView {
1313
public var contract: Contract<Value>?
1414

15+
public init(_ closure: (UIView) -> Contract<Value>) {
16+
super.init(frame: .zero)
17+
18+
let view = UIView()
19+
20+
self.contract = closure(view)
21+
22+
embed {
23+
view
24+
}
25+
26+
contract?.value = contract?.value
27+
}
28+
1529
public init(view: View, _ closure: (View) -> Contract<Value>) {
1630
super.init(frame: .zero)
1731

Tests/SwiftUIKitTests/Core/BasicSwiftUIKitTests.swift

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ final class BasicSwiftUIKitTests: XCTestCase {
209209

210210
XCTAssert(stack.subviews.first.map { type(of: $0) } == UIStackView.self)
211211
XCTAssertEqual(stack.allSubviews.count, 2)
212-
XCTAssertEqual(stack.views.value?.count, 1)
212+
XCTAssertEqual(stack.views.count, 1)
213213
}
214214

215215
func testVStackViewAppend_one() {
@@ -222,13 +222,13 @@ final class BasicSwiftUIKitTests: XCTestCase {
222222
]
223223
}
224224

225-
stack.views.value?.append(UIView())
226-
227-
stack.draw(views: stack.views.value ?? [])
225+
stack.update { (views) in
226+
views.append(UIView())
227+
}
228228

229229
XCTAssert(stack.subviews.first.map { type(of: $0) } == UIStackView.self)
230230
XCTAssertEqual(stack.allSubviews.count, 3)
231-
XCTAssertEqual(stack.views.value?.count, 2)
231+
XCTAssertEqual(stack.views.count, 2)
232232
}
233233

234234
func testVStackViewAppend_five() {
@@ -241,13 +241,13 @@ final class BasicSwiftUIKitTests: XCTestCase {
241241
]
242242
}
243243

244-
stack.views.value? += (0 ... 4).map { Label("\($0)") }
245-
246-
stack.draw(views: stack.views.value ?? [])
244+
stack.update { (views) in
245+
views += (0 ... 4).map { Label("\($0)") }
246+
}
247247

248248
XCTAssert(stack.subviews.first.map { type(of: $0) } == UIStackView.self)
249249
XCTAssertEqual(stack.allSubviews.count, 7)
250-
XCTAssertEqual(stack.views.value?.count, 6)
250+
XCTAssertEqual(stack.views.count, 6)
251251
}
252252

253253
func testHStackView() {
@@ -262,7 +262,7 @@ final class BasicSwiftUIKitTests: XCTestCase {
262262

263263
XCTAssert(stack.subviews.first.map { type(of: $0) } == UIStackView.self)
264264
XCTAssertEqual(stack.allSubviews.count, 2)
265-
XCTAssertEqual(stack.views.value?.count, 1)
265+
XCTAssertEqual(stack.views.count, 1)
266266
}
267267

268268
func testHStackViewAppend_one() {
@@ -275,13 +275,13 @@ final class BasicSwiftUIKitTests: XCTestCase {
275275
]
276276
}
277277

278-
stack.views.value?.append(UIView())
279-
280-
stack.draw(views: stack.views.value ?? [])
278+
stack.update { (views) in
279+
views.append(UIView())
280+
}
281281

282282
XCTAssert(stack.subviews.first.map { type(of: $0) } == UIStackView.self)
283283
XCTAssertEqual(stack.allSubviews.count, 3)
284-
XCTAssertEqual(stack.views.value?.count, 2)
284+
XCTAssertEqual(stack.views.count, 2)
285285
}
286286

287287
func testHStackViewAppend_five() {
@@ -293,13 +293,13 @@ final class BasicSwiftUIKitTests: XCTestCase {
293293
]
294294
}
295295

296-
stack.views.value? += (0 ... 4).map { Label("\($0)") }
297-
298-
stack.draw(views: stack.views.value ?? [])
296+
stack.update { (views) in
297+
views += (0 ... 4).map { Label("\($0)") }
298+
}
299299

300300
XCTAssert(stack.subviews.first.map { type(of: $0) } == UIStackView.self)
301301
XCTAssertEqual(stack.allSubviews.count, 7)
302-
XCTAssertEqual(stack.views.value?.count, 6)
302+
XCTAssertEqual(stack.views.count, 6)
303303
}
304304

305305
func testZStackView() {

0 commit comments

Comments
 (0)