Сбой приложения с ошибкой: общий параметр «T» не может быть выведен

Я пытаюсь получить пользовательский объект, который можно хэшировать из UserDefault. Моя пользовательская модель определена ниже:

class WorkerProfileResponse: Mappable, Hashable{

    static func == (lhs: WorkerProfileResponse, rhs: WorkerProfileResponse) -> Bool {
        return lhs.id == rhs.id
    } 
    var hashValue: Int{
        return self.id!
    }
    var id, loginStatus, lastLogin, lastActive: Int?
    var username, email, mobileNumber: String?
    var userCategories: [String]?
    var userSubCategories: [String]?
    var biometricToken: String?
    var accessToken: AccessToken?
    var userStatus: UserStatus?
    var userProfile: UserProfile?

    required init(map: Map) {        
    }

    func mapping(map: Map) {
        id <- map["id"]
        loginStatus <- map["is_logged_in"]
        lastLogin <- map["last_login"]
        lastActive <- map["last_active"]
        biometricToken <- map["biometricToken"]
        username <- map["username"]
        email <- map["email"]
        mobileNumber <- map["mobile_number"]
        accessToken <- map["accessToken"]
        userStatus <- map["userStatus"]
        userCategories <- map["userCategories"]
        userSubCategories <- map["userSubCategories"]
        userProfile <- map["userProfile"]
    }
 }

Мой метод userdefault:

class func getModel<T: Hashable>(key: String) -> T {
        let decoded  = UserDefaults.standard.data(forKey: key)
        let decodedModel = NSKeyedUnarchiver.unarchiveObject(with: decoded!) as! T
        return decodedModel
    }

И я называю это так:

UserDefault.getModel(key: "workerProfile")

Приложение падает, когда я вызываю этот метод. Я не понимаю причину, ошибка:

error: generic parameter 'T' could not be inferred

person Faraz A. Khan    schedule 08.04.2020    source источник
comment
Почему вы используете Codable, Mappable и NSKeyedArchiver? Первые два делают почти то же самое, а последний не имеет ничего общего с первым. NSKeyedArchiver связан с objective-c-ish NSCoding, который требует NSObject подклассов.   -  person vadian    schedule 08.04.2020
comment
Да, кодируемого там нет, извините, мой плохой.   -  person Faraz A. Khan    schedule 08.04.2020


Ответы (1)


Я отвечаю на свой вопрос, если это поможет кому-то в будущем. При декодировании произошел сбой, потому что в userdefault не было значения.

В этой строке возникла проблема из-за принудительного литья:

let decodedModel = NSKeyedUnarchiver.unarchiveObject(with: decoded!) as! T

Я изменил этот метод:

class func getModel<T: Hashable>(key: String) -> T {
        let decoded  = UserDefaults.standard.data(forKey: key)
        let decodedModel = NSKeyedUnarchiver.unarchiveObject(with: decoded!) as! T
        return decodedModel
    }

К этому:

class func getModel<T: Hashable>(key: String) -> T? {
        let decoded  = UserDefaults.standard.data(forKey: key)
        if decoded != nil{
            let decodedModel = NSKeyedUnarchiver.unarchiveObject(with: decoded!) as! T
            return decodedModel
        }
        else
        {
            return nil
        }
    }
person Faraz A. Khan    schedule 08.04.2020
comment
Вы должны использовать условную привязку, а не if x != nil и x!. - person Alexander; 08.04.2020