Возврат из инициализатора без инициализации всех сохраненных свойств Swift Xcode 10.0 - PullRequest
0 голосов
/ 22 января 2019

Все переменные в моей структуре являются необязательными, а затем в конструкторе я получаю эту проблему? «Возврат из инициализатора без инициализации всех сохраненных свойств»

struct Conversation : Codable {


    let chat_id : String?
    let id : String?
    let name : String?
    let profile_pic : String?
    let last_message_from : String?
    let message : String?
    let time : String?
    let unread_count : String?
    let member_count : String?
    var type : ChatType = .Single
    var doctors:[Doctors]?

    enum CodingKeys: String, CodingKey {
        case chat_id = "chat_id"
        case id = "id"
        case name = "name"
        case profile_pic = "profile_pic"
        case last_message_from = "last_message_from"
        case message = "message"
        case time = "time"
        case unread_count = "unread_count"
        case member_count = "member_count"
        case doctors = "doctors"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        chat_id = try values.decodeIfPresent(String.self, forKey: .chat_id)
        id = try values.decodeIfPresent(String.self, forKey: .id)
        name = try values.decodeIfPresent(String.self, forKey: .name)
        profile_pic = try values.decodeIfPresent(String.self, forKey: .profile_pic)
        last_message_from = try values.decodeIfPresent(String.self, forKey: .last_message_from)
        message = try values.decodeIfPresent(String.self, forKey: .message)
        time = try values.decodeIfPresent(String.self, forKey: .time)
        unread_count = try values.decodeIfPresent(String.self, forKey: .unread_count)
        member_count = try values.decodeIfPresent(String.self, forKey: .member_count)
        doctors = try values.decodeIfPresent([Doctors].self, forKey: .doctors)
    }



    init(doctor:Doctors) {
        self.id = doctor.doctorId
        self.profile_pic = doctor.doctorPic
        self.type = .Single
    }




}

1 Ответ

0 голосов
/ 22 января 2019

Если вы создаете инициализатор, вам нужно указать значение для всех сохраненных свойств в инициализаторе, вы не можете использовать значения ваших свойств по умолчанию. Поэтому, даже если вы объявите свои свойства как Optional, вам нужно присвоить им значение nil в инициализаторе, если вы хотите, чтобы они были nil.

Не имеет отношения к вашей проблеме, но нет необходимости объявлять CodingKeys, если все ваши имена свойств совпадают с вашими ключами JSON, а также нет необходимости вручную писать инициализатор init(from:), компилятор может автоматически синтезировать это для вас в твой простой случай. Тем не менее, вы должны соответствовать соглашению об именах Swift, которое является lowerCamelCase для имен переменных (включая enum падежи), поэтому переименуйте ваши свойства соответствующим образом, и тогда вам потребуется CodingKeys.

Помните, что многие из ваших типов на самом деле не имеют смысла. Почему переменные называются count String s? Если они идут как String s из бэкэнда, преобразуйте их в Int s в init(from:). Кроме того, в вашем init(doctor:) имеет смысл добавить doctor к вашему массиву doctors.

struct Conversation : Codable {

    let chatId: String?
    let id: String?
    let name: String?
    let profilePic: String?
    let lastMessageFrom: String?
    let message: String?
    let time: String?
    let unreadCount: String?
    let memberCount: String?
    var type: ChatType = .single
    var doctors:[Doctors]?

    enum CodingKeys: String, CodingKey {
        case chatId = "chat_id"
        case id
        case name
        case profilePic = "profile_pic"
        case lastMessageFrom = "last_message_from"
        case message
        case time
        case unreadCount = "unread_count"
        case memberCount = "member_count"
        case doctors
    }

    init(doctor:Doctors) {
        self.id = doctor.doctorId
        self.profilePic = doctor.doctorPic
        self.type = .single
        self.chatId = nil
        self.name = nil
        self.lastMessageFrom = nil
        self.message = nil
        self.time = nil
        self.unreadCount = nil
        self.memberCount = nil
        self.doctors = [doctor]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...