Supabase登录报错:条件绑定初始化器需为可选类型而非UUID
解决Supabase登录时的"Initializer for conditional binding must have Optional type, not 'UUID'"错误
问题原因
报错的if let loggedInUserId = loggedInUserId这行代码,核心问题是session.user.id返回的是非可选的UUID类型,而if let语法仅用于解包可选类型(带?标识的类型),直接对非可选值使用if let就会触发这个编译错误。
修复方案
登录成功后,session.user.id必然存在(登录失败会直接进入catch分支),所以完全不需要用if let做解包判断,直接去掉这段多余逻辑即可。
修改后的核心代码片段:
do { try await supabase.auth.signIn(email: email, password: password) let session = try await supabase.auth.session let loggedInUserId = session.user.id // 直接使用loggedInUserId,无需if let判断 let userDataAccess = UserDataAccess(supabase: supabase) userDataAccess.fetchUserDataByUserId(userId: loggedInUserId.uuidString) { result in switch result { case .success(let userData): DispatchQueue.main.async { self.displayName = userData.displayName onSuccess(self.displayName) } case .failure(let error): DispatchQueue.main.async { onError("Error fetching user data: \(error.localizedDescription)") } } } } catch { DispatchQueue.main.async { onError("Error during login: \(error.localizedDescription)") } }
完整修复后的代码
import Foundation import Supabase class LogInViewModel: ObservableObject { private let supabase: SupabaseClient @Published var displayName: String = "" init() { supabase = SupabaseClient(supabaseURL: URL(string: Config.supabaseURL)!, supabaseKey: Config.supabaseKey) } func login(email: String, password: String, onSuccess: @escaping (String) -> Void, onError: @escaping (String) -> Void) async { do { try await supabase.auth.signIn(email: email, password: password) let session = try await supabase.auth.session let loggedInUserId = session.user.id let userDataAccess = UserDataAccess(supabase: supabase) userDataAccess.fetchUserDataByUserId(userId: loggedInUserId.uuidString) { result in switch result { case .success(let userData): DispatchQueue.main.async { self.displayName = userData.displayName onSuccess(self.displayName) } case .failure(let error): DispatchQueue.main.async { onError("Error fetching user data: \(error.localizedDescription)") } } } } catch { DispatchQueue.main.async { onError("Error during login: \(error.localizedDescription)") } } } }
内容的提问来源于stack exchange,提问作者Your Friend
相关产品推荐
相关产品推荐

