You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:52:51