Skip to content

Commit 53a3a2f

Browse files
authored
Merge pull request #230 from willdale/226-publishing-changes-from-within-view-updates-is-not-allowed-this-will-cause-undefined-behavior
226: Fix warning about updates from within a view
2 parents a2fbf55 + 9853c61 commit 53a3a2f

18 files changed

+221
-170
lines changed

Sources/SwiftUICharts/BarChart/Models/ChartData/BarChartData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public final class BarChartData: CTBarChartDataProtocol, GetDataProtocol, Publis
2525
@Published public final var viewData: ChartViewData
2626
@Published public final var infoView: InfoViewData<BarChartDataPoint> = InfoViewData()
2727

28-
@Published public final var extraLineData: ExtraLineData!
28+
@Published public final var extraLineData: ExtraLineData?
2929

3030
// Publishable
3131
public var subscription = SubscriptionSet().subscription

Sources/SwiftUICharts/BarChart/Models/ChartData/GroupedBarChartData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class GroupedBarChartData: CTMultiBarChartDataProtocol, GetDataProt
3030
@Published public final var infoView: InfoViewData<GroupedBarDataPoint> = InfoViewData()
3131
@Published public final var groups: [GroupingData]
3232

33-
@Published public final var extraLineData: ExtraLineData!
33+
@Published public final var extraLineData: ExtraLineData?
3434

3535
// Publishable
3636
public var subscription = SubscriptionSet().subscription

Sources/SwiftUICharts/BarChart/Models/ChartData/HorizontalBarChartData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public final class HorizontalBarChartData: CTHorizontalBarChartDataProtocol, Get
2525
@Published public final var viewData: ChartViewData
2626
@Published public final var infoView: InfoViewData<BarChartDataPoint> = InfoViewData()
2727

28-
@Published public final var extraLineData: ExtraLineData!
28+
@Published public final var extraLineData: ExtraLineData?
2929

3030
// Publishable
3131
public var subscription = SubscriptionSet().subscription

Sources/SwiftUICharts/BarChart/Models/ChartData/RangedBarChartData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public final class RangedBarChartData: CTRangedBarChartDataProtocol, GetDataProt
2525
@Published public final var viewData: ChartViewData
2626
@Published public final var infoView: InfoViewData<RangedBarDataPoint> = InfoViewData()
2727

28-
@Published public final var extraLineData: ExtraLineData!
28+
@Published public final var extraLineData: ExtraLineData?
2929

3030
// Publishable
3131
public var subscription = SubscriptionSet().subscription

Sources/SwiftUICharts/BarChart/Models/ChartData/StackedBarChartData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public final class StackedBarChartData: CTMultiBarChartDataProtocol, GetDataProt
2929
@Published public final var infoView: InfoViewData<StackedBarDataPoint> = InfoViewData()
3030
@Published public final var groups: [GroupingData]
3131

32-
@Published public final var extraLineData: ExtraLineData!
32+
@Published public final var extraLineData: ExtraLineData?
3333

3434
// Publishable
3535
public var subscription = SubscriptionSet().subscription

Sources/SwiftUICharts/LineChart/Models/ChartData/LineChartData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class LineChartData: CTLineChartDataProtocol, GetDataProtocol, Publ
3030
public final var noDataText: Text
3131
public final var chartType: (chartType: ChartType, dataSetType: DataSetType)
3232

33-
@Published public final var extraLineData: ExtraLineData!
33+
@Published public final var extraLineData: ExtraLineData?
3434

3535
// Publishable
3636
public var subscription = SubscriptionSet().subscription

Sources/SwiftUICharts/LineChart/Models/ChartData/MultiLineChartData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class MultiLineChartData: CTLineChartDataProtocol, GetDataProtocol,
3030
public final var noDataText: Text
3131
public final var chartType: (chartType: ChartType, dataSetType: DataSetType)
3232

33-
@Published public final var extraLineData: ExtraLineData!
33+
@Published public final var extraLineData: ExtraLineData?
3434

3535
// Publishable
3636
public var subscription = SubscriptionSet().subscription

Sources/SwiftUICharts/LineChart/Models/ChartData/RangedLineChartData.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class RangedLineChartData: CTLineChartDataProtocol, GetDataProtocol
3030
public final var noDataText: Text
3131
public final var chartType: (chartType: ChartType, dataSetType: DataSetType)
3232

33-
@Published public final var extraLineData: ExtraLineData!
33+
@Published public final var extraLineData: ExtraLineData?
3434

3535
// Publishable
3636
public var subscription = SubscriptionSet().subscription

Sources/SwiftUICharts/PieChart/Views/DoughnutChart.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public struct DoughnutChart<ChartData>: View where ChartData: DoughnutChartData
8282
if chartData.disableAnimation {
8383
return 1
8484
} else {
85-
return startAnimation ? 1 : 0
85+
return startAnimation ? 1 : 0.001
8686
}
8787
}
8888
}

Sources/SwiftUICharts/Shared/Types/Stroke.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ public struct Stroke: Hashable, Identifiable {
3737
self.miterLimit = miterLimit
3838
self.dash = dash
3939
self.dashPhase = dashPhase
40-
}
40+
}
41+
42+
static let `default` = Stroke()
4143
}
4244

4345
extension Stroke {

Sources/SwiftUICharts/Shared/ViewModifiers/TouchOverlay.swift

+11-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ internal struct TouchOverlay<T>: ViewModifier where T: CTChartData {
1515

1616
@ObservedObject private var chartData: T
1717
let minDistance: CGFloat
18+
private let specifier: String
19+
private let formatter: NumberFormatter?
20+
private let unit: TouchUnit
1821

1922
internal init(
2023
chartData: T,
@@ -25,9 +28,9 @@ internal struct TouchOverlay<T>: ViewModifier where T: CTChartData {
2528
) {
2629
self.chartData = chartData
2730
self.minDistance = minDistance
28-
self.chartData.infoView.touchSpecifier = specifier
29-
self.chartData.infoView.touchFormatter = formatter
30-
self.chartData.infoView.touchUnit = unit
31+
self.specifier = specifier
32+
self.formatter = formatter
33+
self.unit = unit
3134
}
3235

3336
internal func body(content: Content) -> some View {
@@ -55,6 +58,11 @@ internal struct TouchOverlay<T>: ViewModifier where T: CTChartData {
5558
}
5659
} else { content }
5760
}
61+
.onAppear {
62+
self.chartData.infoView.touchSpecifier = specifier
63+
self.chartData.infoView.touchFormatter = formatter
64+
self.chartData.infoView.touchUnit = unit
65+
}
5866
}
5967
}
6068
#endif

Sources/SwiftUICharts/SharedLineAndBar/Models/Protocols/LineAndBarProtocols.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public protocol CTLineBarChartDataProtocol: CTChartData where CTStyle: CTLineBar
3838
/**
3939
A data model for the `ExtraLine` View Modifier
4040
*/
41-
var extraLineData: ExtraLineData! { get set }
41+
var extraLineData: ExtraLineData? { get set }
4242

4343
/**
4444
A type representing a View for displaying second set of labels on the Y axis.

Sources/SwiftUICharts/SharedLineAndBar/Models/Protocols/LineAndBarProtocolsExtentions.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,12 @@ extension CTLineBarChartDataProtocol {
311311

312312
internal var extraLabelsArray: [String] { self.generateExtraYLabels(self.viewData.yAxisSpecifier) }
313313
private func generateExtraYLabels(_ specifier: String) -> [String] {
314-
315-
let dataRange: Double = self.extraLineData.range
316-
let minValue: Double = self.extraLineData.minValue
317-
let range: Double = dataRange / Double(self.extraLineData.style.yAxisNumberOfLabels-1)
314+
guard let extraLineData = extraLineData else { return [] }
315+
let dataRange: Double = extraLineData.range
316+
let minValue: Double = extraLineData.minValue
317+
let range: Double = dataRange / Double(extraLineData.style.yAxisNumberOfLabels-1)
318318
let firstLabel = [String(format: specifier, minValue)]
319-
let otherLabels = (1...self.extraLineData.style.yAxisNumberOfLabels-1).map { String(format: specifier, minValue + range * Double($0)) }
319+
let otherLabels = (1...extraLineData.style.yAxisNumberOfLabels-1).map { String(format: specifier, minValue + range * Double($0)) }
320320
let labels = firstLabel + otherLabels
321321
return labels
322322

@@ -363,7 +363,7 @@ extension CTLineBarChartDataProtocol {
363363

364364
public func getExtraYAxisTitle(colour: AxisColour) -> some View {
365365
Group {
366-
if let title = self.extraLineData.style.yAxisTitle {
366+
if let title = self.extraLineData?.style.yAxisTitle {
367367
VStack {
368368
if self.chartStyle.xAxisLabelPosition == .top {
369369
Spacer()
@@ -391,7 +391,7 @@ extension CTLineBarChartDataProtocol {
391391
case .none:
392392
EmptyView()
393393
case .style(let size):
394-
self.getAxisColourAsCircle(customColour: self.extraLineData.style.lineColour, width: size)
394+
self.getAxisColourAsCircle(customColour: self.extraLineData?.style.lineColour ?? ColourStyle(), width: size)
395395
case .custom(let colour, let size):
396396
self.getAxisColourAsCircle(customColour: colour, width: size)
397397
}

0 commit comments

Comments
 (0)