From 3f63493b2adc7d9fd7ae6582d6deb0f34e8d2efa Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 31 Aug 2025 10:28:59 -0700 Subject: [PATCH 1/4] style layer collection --- .../Style Layers/StyleLayerCollection.swift | 14 ++++++++++++++ Sources/MapLibreSwiftUI/MapView.swift | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Sources/MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift b/Sources/MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift index bd79654..bd90bc8 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift @@ -3,3 +3,17 @@ import Foundation public protocol StyleLayerCollection { @MapViewContentBuilder var layers: [StyleLayerDefinition] { get } } + +/// Enables more natural "Builder" return value (more like SwiftUI's View) +/// +/// Instead of: +/// ``` +/// @MapViewContentBuilder mapContent: @escaping () -> [StyleLayerDefinition] +/// ``` +/// You can do: +/// ``` +/// @MapViewContentBuilder mapContent: @escaping () -> some StyleLayerCollection +/// ``` +extension Array: StyleLayerCollection where Element == StyleLayerDefinition { + public var layers: [StyleLayerDefinition] { self } +} diff --git a/Sources/MapLibreSwiftUI/MapView.swift b/Sources/MapLibreSwiftUI/MapView.swift index 7fb338b..70f5485 100644 --- a/Sources/MapLibreSwiftUI/MapView.swift +++ b/Sources/MapLibreSwiftUI/MapView.swift @@ -58,12 +58,12 @@ public struct MapView: UIViewControllerRepresentab camera: Binding = .constant(.default()), locationManager: MLNLocationManager? = nil, activity: MapActivity = .standard, - @MapViewContentBuilder _ makeMapContent: () -> [StyleLayerDefinition] = { [] } + @MapViewContentBuilder _ makeMapContent: () -> some StyleLayerCollection = { [] } ) { self.makeViewController = makeViewController styleSource = .url(styleURL) _camera = camera - userLayers = makeMapContent() + userLayers = makeMapContent().layers self.locationManager = locationManager self.activity = activity } From 09096b5cc7bb98bd4f9652df04c5de9523a61f01 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 31 Aug 2025 13:35:55 -0700 Subject: [PATCH 2/4] style layer collection format --- .../MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift b/Sources/MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift index bd90bc8..8a1d10b 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/StyleLayerCollection.swift @@ -14,6 +14,6 @@ public protocol StyleLayerCollection { /// ``` /// @MapViewContentBuilder mapContent: @escaping () -> some StyleLayerCollection /// ``` -extension Array: StyleLayerCollection where Element == StyleLayerDefinition { +extension [StyleLayerDefinition]: StyleLayerCollection { public var layers: [StyleLayerDefinition] { self } } From 9837dfe8e73fc2df02619ae3072128e4534cf964 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 31 Aug 2025 13:47:53 -0700 Subject: [PATCH 3/4] style layer collection format --- Sources/MapLibreSwiftDSL/Style Layers/Background.swift | 4 ++-- Sources/MapLibreSwiftDSL/Style Layers/Circle.swift | 4 ++-- Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift | 4 ++-- Sources/MapLibreSwiftDSL/Style Layers/Line.swift | 4 ++-- Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift | 4 ++-- Sources/MapLibreSwiftUI/Examples/Camera.swift | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Sources/MapLibreSwiftDSL/Style Layers/Background.swift b/Sources/MapLibreSwiftDSL/Style Layers/Background.swift index 0f9e104..e5d4ec5 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/Background.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/Background.swift @@ -9,8 +9,8 @@ public struct BackgroundLayer: StyleLayer { public let identifier: String public var insertionPosition: LayerInsertionPosition = .below(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public init(identifier: String) { self.identifier = identifier diff --git a/Sources/MapLibreSwiftDSL/Style Layers/Circle.swift b/Sources/MapLibreSwiftDSL/Style Layers/Circle.swift index 6026212..9e6794a 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/Circle.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/Circle.swift @@ -12,8 +12,8 @@ public struct CircleStyleLayer: SourceBoundVectorStyleLayerDefinition { public let sourceLayerIdentifier: String? public var insertionPosition: LayerInsertionPosition = .above(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public var source: StyleLayerSource public var predicate: NSPredicate? diff --git a/Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift b/Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift index f610c27..c6b9a47 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/FillStyleLayer.swift @@ -12,8 +12,8 @@ public struct FillStyleLayer: SourceBoundVectorStyleLayerDefinition { public let sourceLayerIdentifier: String? public var insertionPosition: LayerInsertionPosition = .above(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public var source: StyleLayerSource public var predicate: NSPredicate? diff --git a/Sources/MapLibreSwiftDSL/Style Layers/Line.swift b/Sources/MapLibreSwiftDSL/Style Layers/Line.swift index 6e50dfd..5286c8d 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/Line.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/Line.swift @@ -14,8 +14,8 @@ public struct LineStyleLayer: SourceBoundVectorStyleLayerDefinition { public let sourceLayerIdentifier: String? public var insertionPosition: LayerInsertionPosition = .above(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public var source: StyleLayerSource public var predicate: NSPredicate? diff --git a/Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift b/Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift index 779753a..f898780 100644 --- a/Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift +++ b/Sources/MapLibreSwiftDSL/Style Layers/Symbol.swift @@ -29,8 +29,8 @@ public struct SymbolStyleLayer: SourceBoundVectorStyleLayerDefinition { public let sourceLayerIdentifier: String? public var insertionPosition: LayerInsertionPosition = .above(.all) public var isVisible: Bool = true - public var maximumZoomLevel: Float? = nil - public var minimumZoomLevel: Float? = nil + public var maximumZoomLevel: Float? + public var minimumZoomLevel: Float? public var source: StyleLayerSource public var predicate: NSPredicate? diff --git a/Sources/MapLibreSwiftUI/Examples/Camera.swift b/Sources/MapLibreSwiftUI/Examples/Camera.swift index a7f0f11..10bb005 100644 --- a/Sources/MapLibreSwiftUI/Examples/Camera.swift +++ b/Sources/MapLibreSwiftUI/Examples/Camera.swift @@ -5,8 +5,8 @@ struct CameraDirectManipulationPreview: View { @State private var camera = MapViewCamera.center(switzerland, zoom: 4) let styleURL: URL - var onStyleLoaded: (() -> Void)? = nil - var targetCameraAfterDelay: MapViewCamera? = nil + var onStyleLoaded: (() -> Void)? + var targetCameraAfterDelay: MapViewCamera? var body: some View { MapView(styleURL: styleURL, camera: $camera) From bf79afa0c194120be336ac89cc3c1141dc94f6d0 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 31 Aug 2025 13:51:20 -0700 Subject: [PATCH 4/4] style layer collection format --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8191f6b..27d1cce 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,7 +24,7 @@ jobs: scheme: [MapLibreSwiftUI-Package] destination: [ # TODO: Add more destinations (snapshot testing is the problem) - "platform=iOS Simulator,name=iPhone 16,OS=18.1", + "platform=iOS Simulator,name=iPhone 16,OS=18.6", # 'platform=watchOS Simulator,name=Apple Watch Ultra 2 (49mm)', # "platform=iOS Simulator,name=iPad (10th generation),OS=16.4", # "platform=iOS Simulator,name=iPhone 15,OS=17.2",