SwiftUI中使用Firebase updateData更新数组时编译错误求助
I’ve run into this exact quirky SwiftUI/Firestore compilation error before, and it’s almost always tied to type inference hiccups with the [AnyHashable: Any] dictionary that updateData expects—made worse by SwiftUI’s behind-the-scenes design-time helper functions messing with the compiler’s logic. Let’s break down how to fix it.
The Problem Recap
You’re trying to update a Firestore array using FieldValue.arrayUnion, but hitting this confusing error:
global function '__designTimeString(_:fallback:)' requires that 'AnyHashable' conform to 'ExpressibleByStringLiteral'
Your code looks like this:
db.collection("restaurants").document(restaurantId).updateData([ "reviews": FieldValue.arrayUnion([id]) ]) { err in if let err = err { print("Error updating document: \(err)") } else { print("Document successfully updated") } }
Solutions to Try
1. Explicitly Type the Update Dictionary
The simplest fix is to explicitly define your update dictionary as [String: Any] first. This lets the compiler correctly handle the string key without triggering the design-time function conflict, and [String: Any] is fully compatible with [AnyHashable: Any]:
// Define fields with clear type to avoid inference confusion let updateFields: [String: Any] = [ "reviews": FieldValue.arrayUnion([id]) ] // Pass the pre-defined dictionary to updateData db.collection("restaurants").document(restaurantId).updateData(updateFields) { err in if let err = err { print("Error updating document: \(err)") } else { print("Document successfully updated") } }
Alternatively, you can wrap the key in AnyHashable directly to remove ambiguity for the compiler:
db.collection("restaurants").document(restaurantId).updateData([ AnyHashable("reviews"): FieldValue.arrayUnion([id]) ]) { err in // Error handling logic here }
2. Move Firestore Logic to a Helper Function
SwiftUI’s design-time helpers tend to interfere more when code is embedded directly in view modifiers or body closures. Moving the Firestore update to a separate helper function (outside your SwiftUI view struct) often resolves the issue:
// Add this outside your SwiftUI view struct func addReviewToRestaurant(restaurantId: String, reviewId: String) { let db = Firestore.firestore() db.collection("restaurants").document(restaurantId).updateData([ "reviews": FieldValue.arrayUnion([reviewId]) ]) { err in if let err = err { print("Error updating document: \(err)") } else { print("Document successfully updated") } } } // Call the helper from your SwiftUI view: addReviewToRestaurant(restaurantId: restaurantId, reviewId: id)
3. Clear Xcode Derived Data
Sometimes this error is just a weird Xcode cache glitch. Try cleaning your project (Cmd+Shift+K), deleting Derived Data (go to Xcode > Settings > Locations > Derived Data, click the arrow to open the folder, then delete its contents), then restart Xcode and rebuild.
Why This Happens
The __designTimeString function is an internal SwiftUI helper used for preview and design-time string handling. When you pass an inline [AnyHashable: Any] dictionary with a string literal key, the compiler’s type inference gets confused in design mode—it tries to apply the __designTimeString constraints to AnyHashable, which doesn’t conform to ExpressibleByStringLiteral directly. Explicit typing or moving the code out of the view body bypasses this confusion entirely.
内容的提问来源于stack exchange,提问作者chessa

