应用程序因错误而崩溃:无法推断通用参数“T”

Posted

技术标签:

【中文标题】应用程序因错误而崩溃:无法推断通用参数“T”【英文标题】:App Crashing with error: generic parameter 'T' could not be inferred 【发布时间】:2020-04-08 12:14:26 【问题描述】:

我正在尝试从 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"]
    
 

我的用户默认方法是:

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

【问题讨论】:

你为什么使用CodableMappableNSKeyedArchiver?前两个几乎相同,最后一个与第一个没有任何关系NSKeyedArchiverobjective-c-ish NSCoding 相关,后者需要 NSObject 子类。 是的,codable 不存在,对不起。 【参考方案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
        
    

【讨论】:

你应该使用条件绑定,而不是if x != nilx!

以上是关于应用程序因错误而崩溃:无法推断通用参数“T”的主要内容,如果未能解决你的问题,请参考以下文章

无法推断通用参数“T” - Swift 5.5

无法推断通用参数“D”。 [订购错误]

更新到 sdk 版本 23 后,我的应用程序因一些浮动操作按钮错误而崩溃?

写入后 NSOutputStream 因访问错误而崩溃(Objective-c)

无法推断通用参数“值”

Arcgis因遇到严重的应用程序错误而无法继续