Swift 从初始值设定项快速返回,而不初始化所有存储的属性

Swift 从初始值设定项快速返回,而不初始化所有存储的属性,swift,xcode,firebase,Swift,Xcode,Firebase,我到处都找过了,找不到这个代码不起作用的原因。我正在尝试初始化我的用户类,该类将与Firebase一起工作,因此我需要初始化一个字典,以便能够检索JSON数据。我已经做了很多次了,没有遇到任何问题,但由于某种原因,这次xcode给了我“从初始化器返回,而不初始化所有存储的属性”。从我可以看到,我的所有属性都已初始化。我错过什么了吗?提前感谢您的hep enum UserAccessLevel: String { case unknown = "Unknown" case

我到处都找过了,找不到这个代码不起作用的原因。我正在尝试初始化我的用户类,该类将与Firebase一起工作,因此我需要初始化一个字典,以便能够检索JSON数据。我已经做了很多次了,没有遇到任何问题,但由于某种原因,这次xcode给了我“从初始化器返回,而不初始化所有存储的属性”。从我可以看到,我的所有属性都已初始化。我错过什么了吗?提前感谢您的hep

    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
        }


    }
enum UserAccessLevel:字符串{
case unknown=“unknown”
案例执行制片人=“执行制片人”
案例topTierProducer=“顶级生产商”
案例lowTierProducer=“低层生产者”
case crew=“机组成员”
案例供应商=“供应商”
案例人才=“人才”
}
枚举访问:字符串{
case grated=“true”
case denied=“false”
}
枚举FIRUserData:字符串{
case firstName=“firstName”
case lastName=“lastName”
案例城市=“城市”
case state=“state”
case profileImage=“profileImage”
case userName=“userName”
case accessLevel=“accessLevel”
}
协议用户{
var firstName:String{get set}
var lastName:String{get set}
var city:字符串{get set}
var state:USAState{get set}
var profileImage:字符串{get set}
var用户名:字符串{get set}
var accessLevel:UserAccessLevel{get set}
func createUser()抛出
func signUser()抛出
func signOutUser()
func archiveProject()
func activateProject()
func deleteProject()
}
类UserType:User{
var firstName:String
var lastName:String
var城市:字符串
变量状态:USATATE
var profileImage:String
var用户名: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=城市
self.state=状态
self.profileImage=profileImage
self.userName=“\(姓氏)。\(姓氏)”
self.accessLevel=accessLevel
}
init(用户名:字符串,用户数据:字典){
self.userName=用户名
如果让firstName=userData[FIRUserData.firstName.rawValue]{
self.firstName=firstName as!String
}
如果让lastName=userData[FIRUserData.lastName.rawValue]{
self.lastName=lastName as!String
}
如果let city=userData[FIRUserData.city.rawValue]{
self.city=city as!字符串
}
如果let state=userData[FIRUserData.state.rawValue]{
self.state=状态为!usstate
}
如果让profileImage=userData[FIRUserData.profileImage.rawValue]{
self.profileImage=profileImage as!String
}
如果让accessLevel=userData[FIRUserData.accessLevel.rawValue]{
self.accessLevel=accessLevel as!UserAccessLevel
}
}

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

在第二个
init
中,对于
UserType
类,Xcode并不认为所有的类属性都是ranteed需要设置,因为
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
}
init(用户名:字符串,用户数据:字典){
self.userName=用户名
如果让firstName=userData[FIRUserData.firstName.rawValue]作为?字符串{
self.firstName=firstName
}否则{
firstName=//还有别的吗
}
//对其他if语句执行相同的操作
}

如果让firstName=userData[FIRUserData.firstName.rawValue]作为字符串{更好的方法是使用nil合并操作符
分配默认值
firstName=userData[FIRUserData.firstName.rawValue]作为?字符串??“默认值”
或将firstName属性设为可选字符串
字符串?
@LeoDabus Lol,对不起,我再次从OP复制了代码。
操作符也很好。谢谢大家!正是这样!我之前做的时候,它们被强制展开,我不想再这样做了,但这就是为什么以前没有错误的原因.没问题。很高兴我们都能帮忙:)