Swift – 无条件dynamic强制类?

似乎我不能将一个genericstypes转换为另一个genericstypes? 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>NetworkResponse<User>基本上是完全不相关的types,碰巧具有相同的function和类似的命名。

在这个特定的情况下,它确实没有必要,因为你已经抛弃了结果的已知User ,意思是说,如果你真的想把它当作一个User那么你将不得不做一个有条件的转换。 只需从NetworkResponse删除generics,它将全部按预期工作。 主要的缺点是,在UserVC.fetchData ,没有(条件) UserVC.fetchData您将无法访问返回的User结果。

另一种解决scheme是使用某种types的包装器(假设存在重要的边带数据)将NSObjecttypes( User / NSObject )中的NetworkResponse任何附加信息分离出来。 这样,您可以将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)) } } } 

尽pipe在这一点上,您最好将交易信息和有效负载信息分离成callback的单独参数。