应用程序因错误而崩溃:无法推断通用参数“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
【问题讨论】:
你为什么使用Codable
、Mappable
和NSKeyedArchiver
?前两个几乎相同,最后一个与第一个没有任何关系。 NSKeyedArchiver
与 objective-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 != nil
和x!
。以上是关于应用程序因错误而崩溃:无法推断通用参数“T”的主要内容,如果未能解决你的问题,请参考以下文章
更新到 sdk 版本 23 后,我的应用程序因一些浮动操作按钮错误而崩溃?