【问题标题】:Swift Return from initializer without initializing all stored properties从初始化程序快速返回而不初始化所有存储的属性
【发布时间】:2018-01-01 07:05:32
【问题描述】:

我到处寻找,找不到这段代码不起作用的原因。我正在尝试初始化将与 Firebase 一起使用的 User 类,因此我需要初始化一个字典才能检索 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
        }


    }

【问题讨论】:

    标签: swift xcode firebase


    【解决方案1】:

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

    解决方案是为您的所有 if 语句添加一个 else 块:

    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
    }
    

    【讨论】:

    • 它已经在使用的用户 if let 为什么不将它有条件地转换为 String 呢? if let firstName = userData[FIRUserData.firstName.rawValue] as? String {
    • 更好的方法是使用 nil 合并运算符 ?? 分配默认值 firstName = userData[FIRUserData.firstName.rawValue] as? String ?? "default value" 或将 firstName 属性设为可选字符串 String?
    • @LeoDabus Lol,对不起,我再次从 OP 复制了代码。 ?? 运算符也很好。
    • 谢谢大家!就是这样......当我之前这样做时,它们被强制解开,我不想再这样做了,但这就是为什么之前没有错误。
    • 没问题。很高兴我们都能提供帮助:)
    【解决方案2】:

    如果userData 字典中缺少值,则第二个初始化程序不会初始化字段。在这种情况下,您需要决定 UserType 的字段会发生什么。

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 2017-12-31
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 2017-01-07
      • 2021-06-28
      相关资源
      最近更新 更多