Swift 从初始化程序返回而不初始化所有存储的属性

标签 swift xcode firebase

我找遍了所有地方,找不到此代码无法正常工作的原因。我正在尝试初始化将与 Firebase 一起使用的用户类,因此我需要初始化一个字典才能检索 JSON 数据。我已经这样做了很多次并且没有遇到任何问题但是由于某种原因这次 xcode 给了我“从初始化程序返回而不初始化所有存储的属性”。据我所知,我的所有属性都已初始化。我错过了什么吗?预先感谢您的帮助!

    enum UserAccessLevel: String {
    case unknown = "Unknown"
    case executiveProducer = "Executive Producer"
    case topTierProducer = "Top Tier Producer"
    case lowTierProducer = "Low Tier Producer"
    case crew = "Crew Member"
    case vendor = "Vendor"
    case talent = "Talent"
}

enum Access: String {
    case granted = "true"
    case denied = "false"
}

enum FIRUserData: String {
    case firstName = "firstName"
    case lastName = "lastName"
    case city = "city"
    case state = "state"
    case profileImage = "profileImage"
    case userName = "userName"
    case accessLevel = "accessLevel"
}

protocol User {
    var firstName: String { get set }
    var lastName: String { get set }
    var city: String { get set }
    var state: USAState { get set }
    var profileImage: String { get set }
    var userName: String { get set }
    var accessLevel: UserAccessLevel { get set }

    func createUser() throws
    func signInUser() throws
    func signOutUser()
    func archiveProject()
    func activateProject()
    func deleteProject()
}

class UserType: User {
    var firstName: String
    var lastName: String
    var city: String
    var state: USAState
    var profileImage: String
    var userName: String
    var accessLevel: UserAccessLevel

    init(firstName: String, lastName: String, city: String, state: USAState, profileImage: String, u accessLevel: UserAccessLevel) {
        self.firstName = firstName
        self.lastName = lastName
        self.city = city
        self.state = state
        self.profileImage = profileImage
        self.userName = "\(firstName).\(lastName)"
        self.accessLevel = accessLevel
    }

    init(userName: String, userData: Dictionary <String, Any>) {
        self.userName = userName

        if let firstName = userData[FIRUserData.firstName.rawValue] {
            self.firstName = firstName as! String
        }
        if let lastName = userData[FIRUserData.lastName.rawValue] {
           self.lastName = lastName as! String
        }
        if let city = userData[FIRUserData.city.rawValue] {
            self.city = city as! String
        }
        if let state = userData[FIRUserData.state.rawValue] {
            self.state = state as! USAState
        }
        if let profileImage = userData[FIRUserData.profileImage.rawValue] {
            self.profileImage = profileImage as! String
        }
        if let accessLevel = userData[FIRUserData.accessLevel.rawValue] {
            self.accessLevel = accessLevel as! UserAccessLevel
        }


    }

最佳答案

在您的 UserType 类的第二个 init 中,Xcode 认为不能保证设置所有类属性,因为 if 语句可能会失败。

解决方案是为所有 if 语句包含一个 else block :

init(userName: String, userData: Dictionary <String, Any>) {
    self.userName = userName

    if let firstName = userData[FIRUserData.firstName.rawValue] as? String {
        self.firstName = firstName
    } else {
        firstName = //something else
    }

    //do the same thing with other if statements
}

关于Swift 从初始化程序返回而不初始化所有存储的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48046101/

相关文章:

android - 如何使用 Google Provider 重新验证 Firebase 上的用户?

Xcode 4.3.2 和 100% CPU 在空闲时间不断

json - 如何从 XCUITest 读取 Json 文件?

swift - 根据用户的 Firebase 登录状态显示 View Controller

swift - 自定义 TableViewCell 出了问题?

ios - 处理屏幕尺寸的正确方法

ios - 如何遍历并获取 firebase 中嵌套节点的所有键?

ios - 如何在ios swift中从Parse中按降序对NSDate进行排序

ios - 尝试在 Xcode 11 中的 UITesting 期间滚动 MapView

swift - 和有什么不一样?和 ? = 无