我似乎无法将泛型类型转换为另一个类型? Swift 抛出 DynamicCastClassException。
基本上问题是这样的:
// T is defined as T: NSObject
let oebj1 = NetworkResponse<User>()
let oebj2 = oebj1 as NetworkResponse<NSObject>
这就是我需要进行此铸造的原因
class BaseViewController: UIViewController {
// Not allowed to make a generic viewController and therefore have to cast the generic down to NSObject
func fetchData(completion: (NetworkResponse<NSObject>)->()) {
fatalError("You have to implement fetchData method")
}
}
class UsersViewController: BaseViewController {
override func fetchData(completion: (NetworkResponse<NSObject>)->()) {
userNetworkManager.fetchUsers { networkUSerResponse in
completion(networkUSerResponse as NetworkResponse<NSObject>)
}
}
}
class UserNetworkManager {
func fetchUsers(completion: (NetworkResponse<User>)->()) {
// Do stuff
}
}
一般来说,似乎没有办法做到这一点。基本问题是NetworkResponse<NSObject>
and NetworkResponse<User>
本质上是完全不相关的类型,但碰巧具有相同的功能和相似的命名。
在这种特定情况下,这确实没有必要,因为您要扔掉已知的User
无论如何,结果的本质是,这意味着如果你真的想把它当作一个User
稍后你将不得不进行有条件的强制转换。只需删除通用的NetworkResponse
一切都会按预期进行。主要缺点是在UserVC.fetchData
您将无权访问返回的User
没有(条件)强制转换的结果。
另一种解决方案是分离出其中的任何附加信息NetworkResponse
从有效负载类型(User
/NSObject
)使用某种包装器(假设那里有重要的边带数据)。这样你就可以通过NetworkResponse
无需修改即可进行超级转换,并根据需要向下转换有效负载对象。
像这样的事情:
class User : NSObject {
}
class Transaction {
let request:NSURLRequest?
let response:NSURLResponse?
let data:NSData?
}
class Response<T:NSObject> {
let transaction:Transaction
let payload:T
init(transaction:Transaction, payload:T) {
self.transaction = transaction
self.payload = payload
}
}
class UserNetworkManager {
func fetchUsers(completion: (Response<User>) -> ()) {
completion(Response(transaction:Transaction(), payload:User()))
}
}
let userNetworkManager = UserNetworkManager();
class BaseVC {
func fetchData(completion: (Response<NSObject>) -> ()) {
fatalError("Gotta implement fetchData")
}
}
class UserVC : BaseVC {
override func fetchData(completion: (Response<NSObject>) -> ()) {
userNetworkManager.fetchUsers { response -> () in
completion(Response(transaction: response.transaction, payload: response.payload))
}
}
}
尽管如此,您可能最好将事务信息和有效负载信息分离到回调的单独参数中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)