Remove debug prints and fix build warnings

- Remove all print statements from planning engine, data providers, and PDF generation
- Fix deprecated CLGeocoder usage with MKLocalSearch for iOS 26
- Fix Swift 6 actor isolation by converting PDFGenerator/ExportService to @MainActor
- Add @retroactive to CLLocationCoordinate2D protocol conformances
- Fix unused variable warnings in GameDAGRouter and scenario planners
- Remove unreachable catch blocks in SettingsViewModel

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-08 13:25:27 -06:00
parent fbb5ae683e
commit 045fcd9c07
20 changed files with 188 additions and 303 deletions

View File

@@ -39,11 +39,9 @@ final class AppDataProvider: ObservableObject {
#if targetEnvironment(simulator)
self.provider = StubDataProvider()
self.isUsingStubData = true
print("📱 Using StubDataProvider (Simulator)")
#else
self.provider = CloudKitDataProvider()
self.isUsingStubData = false
print("☁️ Using CloudKitDataProvider (Device)")
#endif
}
@@ -66,16 +64,12 @@ final class AppDataProvider: ObservableObject {
// Build lookup dictionaries
self.teamsById = Dictionary(uniqueKeysWithValues: loadedTeams.map { ($0.id, $0) })
self.stadiumsById = Dictionary(uniqueKeysWithValues: loadedStadiums.map { ($0.id, $0) })
print("✅ Loaded \(teams.count) teams, \(stadiums.count) stadiums")
} catch let cloudKitError as CloudKitError {
self.error = cloudKitError
self.errorMessage = cloudKitError.errorDescription
print("❌ CloudKit error: \(cloudKitError.errorDescription ?? "Unknown")")
} catch {
self.error = error
self.errorMessage = error.localizedDescription
print("❌ Failed to load data: \(error)")
}
isLoading = false

View File

@@ -74,7 +74,6 @@ actor LoadingTextGenerator {
return message
} catch {
print("[LoadingTextGenerator] Foundation Models error: \(error)")
return nil
}
}

View File

@@ -96,9 +96,7 @@ extension LocationPermissionManager: CLLocationManagerDelegate {
}
nonisolated func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
Task { @MainActor in
print("Location error: \(error.localizedDescription)")
}
// Location error handled silently
}
}

View File

@@ -10,28 +10,34 @@ import MapKit
actor LocationService {
static let shared = LocationService()
private let geocoder = CLGeocoder()
private init() {}
// MARK: - Geocoding
func geocode(_ address: String) async throws -> CLLocationCoordinate2D? {
let placemarks = try await geocoder.geocodeAddressString(address)
return placemarks.first?.location?.coordinate
let request = MKLocalSearch.Request()
request.naturalLanguageQuery = address
request.resultTypes = .address
let search = MKLocalSearch(request: request)
let response = try await search.start()
return response.mapItems.first?.location.coordinate
}
func reverseGeocode(_ coordinate: CLLocationCoordinate2D) async throws -> String? {
let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
let placemarks = try await geocoder.reverseGeocodeLocation(location)
let request = MKLocalSearch.Request()
request.region = MKCoordinateRegion(
center: coordinate,
latitudinalMeters: 100,
longitudinalMeters: 100
)
request.resultTypes = .address
guard let placemark = placemarks.first else { return nil }
let search = MKLocalSearch(request: request)
let response = try await search.start()
var components: [String] = []
if let city = placemark.locality { components.append(city) }
if let state = placemark.administrativeArea { components.append(state) }
return components.isEmpty ? nil : components.joined(separator: ", ")
guard let item = response.mapItems.first else { return nil }
return formatMapItem(item)
}
func resolveLocation(_ input: LocationInput) async throws -> LocationInput {
@@ -66,19 +72,27 @@ actor LocationService {
return response.mapItems.map { item in
LocationSearchResult(
name: item.name ?? "Unknown",
address: formatAddress(item.placemark),
coordinate: item.placemark.coordinate
address: formatMapItem(item),
coordinate: item.location.coordinate
)
}
}
private func formatAddress(_ placemark: MKPlacemark) -> String {
@available(iOS, deprecated: 26.0, message: "Uses placemark for address formatting")
private func formatMapItem(_ item: MKMapItem) -> String {
var components: [String] = []
if let city = placemark.locality { components.append(city) }
if let state = placemark.administrativeArea { components.append(state) }
if let country = placemark.country, country != "United States" {
if let locality = item.placemark.locality {
components.append(locality)
}
if let state = item.placemark.administrativeArea {
components.append(state)
}
if let country = item.placemark.country, country != "United States" {
components.append(country)
}
if components.isEmpty {
return item.name ?? ""
}
return components.joined(separator: ", ")
}
@@ -98,8 +112,10 @@ actor LocationService {
to: CLLocationCoordinate2D
) async throws -> RouteInfo {
let request = MKDirections.Request()
request.source = MKMapItem(placemark: MKPlacemark(coordinate: from))
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: to))
let fromLocation = CLLocation(latitude: from.latitude, longitude: from.longitude)
let toLocation = CLLocation(latitude: to.latitude, longitude: to.longitude)
request.source = MKMapItem(location: fromLocation, address: nil)
request.destination = MKMapItem(location: toLocation, address: nil)
request.transportType = .automobile
request.requestsAlternateRoutes = false

View File

@@ -165,48 +165,22 @@ actor StubDataProvider: DataProvider {
return true
}
cachedGames = uniqueJsonGames.compactMap { convertGame($0) }
print("StubDataProvider loaded: \(cachedGames?.count ?? 0) games, \(cachedTeams?.count ?? 0) teams, \(cachedStadiums?.count ?? 0) stadiums")
}
private func loadGamesJSON() throws -> [JSONGame] {
guard let url = Bundle.main.url(forResource: "games", withExtension: "json") else {
print("Warning: games.json not found in bundle")
return []
}
let data = try Data(contentsOf: url)
do {
return try JSONDecoder().decode([JSONGame].self, from: data)
} catch let DecodingError.keyNotFound(key, context) {
print("❌ Games JSON missing key '\(key.stringValue)' at path: \(context.codingPath.map { $0.stringValue }.joined(separator: "."))")
throw DecodingError.keyNotFound(key, context)
} catch let DecodingError.typeMismatch(type, context) {
print("❌ Games JSON type mismatch for \(type) at path: \(context.codingPath.map { $0.stringValue }.joined(separator: "."))")
throw DecodingError.typeMismatch(type, context)
} catch {
print("❌ Games JSON decode error: \(error)")
throw error
}
return try JSONDecoder().decode([JSONGame].self, from: data)
}
private func loadStadiumsJSON() throws -> [JSONStadium] {
guard let url = Bundle.main.url(forResource: "stadiums", withExtension: "json") else {
print("Warning: stadiums.json not found in bundle")
return []
}
let data = try Data(contentsOf: url)
do {
return try JSONDecoder().decode([JSONStadium].self, from: data)
} catch let DecodingError.keyNotFound(key, context) {
print("❌ Stadiums JSON missing key '\(key.stringValue)' at path: \(context.codingPath.map { $0.stringValue }.joined(separator: "."))")
throw DecodingError.keyNotFound(key, context)
} catch let DecodingError.typeMismatch(type, context) {
print("❌ Stadiums JSON type mismatch for \(type) at path: \(context.codingPath.map { $0.stringValue }.joined(separator: "."))")
throw DecodingError.typeMismatch(type, context)
} catch {
print("❌ Stadiums JSON decode error: \(error)")
throw error
}
return try JSONDecoder().decode([JSONStadium].self, from: data)
}
// MARK: - Conversion Helpers
@@ -326,7 +300,6 @@ actor StubDataProvider: DataProvider {
}
// Generate deterministic ID for unknown venues
print("[StubDataProvider] No stadium match for venue: '\(venue)'")
return deterministicUUID(from: "venue_\(venue)")
}