创建迅速泛型
问题描述:
的阵列我有以下结构创建迅速泛型
struct APIResource<T> {
let urlRequest: NSMutableURLRequest
let resource: T
let parse: (NSData) -> T
}
我还具有以下视图控制器。它的任务是要求网络堆栈从网络加载资源。一旦完成,它会调用生成功能来构建相应的视图控制器,然后将它作为一个子视图控制器
final class LoadingVCL: UIViewController {
init<T>(_ resources: APIResource<T>, build: ((T) -> UIViewController)) {
super.init(nibName: nil, bundle: nil)
//ask the network stack for the data
//once data is loaded, I call the build closure
//to return a view controller and add it as a childviewcontroller
}
我在努力扩大这种LoadingVC接受一系列资源和添加之前加载它们视图控制器。
我碰到这个时候跟着this教程。
编辑一个
举例来说,假设我有以下资源
let resourceOne = APIResource<Int>(urlRequest: NSMutableURLRequest(), resource: 1, parse: { _ in return 1})
let resourceTwo = APIResource<Double>(urlRequest: NSMutableURLRequest(), resource: 1, parse: { _ in return 1})
let resourceThree = APIResource<String>(urlRequest: NSMutableURLRequest(), resource: "1", parse: { _ in return "1"})
我试图为视图控制器想出一个办法来接受资源的不同类型的数组。
任何帮助,将不胜感激。 谢谢
答
只要APIResource<T>
的实例被创建它有一个分配的类型,不再是通用的。例如,APIResource<String>
与APIResource<Double>
的类型不同。要创建混合类型的数组,您需要使用协议,例如
protocol APIResourceProtocol{}
struct APIResource<T>:APIResourceProtocol {
let urlRequest: NSMutableURLRequest
let resource: T
let parse: (NSData) -> T
}
let resourceOne = APIResource<Int>(urlRequest: NSMutableURLRequest(), resource: 1, parse: { _ in return 1})
let resourceTwo = APIResource<Double>(urlRequest: NSMutableURLRequest(), resource: 1, parse: { _ in return 1})
let resourceThree = APIResource<String>(urlRequest: NSMutableURLRequest(), resource: "1", parse: { _ in return "1"})
let arr:[APIResourceProtocol] = [resourceOne, resourceTwo, resourceThree]
当然,这可能是不是你想要的,因为你可能希望能够经历一个数组,并使用某些方法。不幸的是,协议不是通用的,所以它只会是非泛型类型,你可以利用这种类型的行为。
protocol APIResourceProtocol {
var urlRequest: NSMutableURLRequest {get set}
}
struct APIResource<T>:APIResourceProtocol {
var urlRequest: NSMutableURLRequest
let resource: T
let parse: (NSData) -> T
}
protocol ResourceType {}
let resourceOne = APIResource<Int>(urlRequest: NSMutableURLRequest(), resource: 1, parse: { _ in return 1})
let resourceTwo = APIResource<Double>(urlRequest: NSMutableURLRequest(), resource: 1, parse: { _ in return 1})
let resourceThree = APIResource<String>(urlRequest: NSMutableURLRequest(), resource: "1", parse: { _ in return "1"})
let arr:[APIResourceProtocol] = [resourceOne, resourceTwo, resourceThree]
arr.map{$0.urlRequest}
绝对不应该在* view *控制器中加载来自网络的内容。无论如何,你的实际问题是什么? – Alexander
UIViewController子类的自定义初始值设定程序通常不起作用,因为您经常会使用故事板场景或使用init(编码器)的nib来组合泛型与ViewController没有多大意义。 – Paulw11
@Alexander我使用网络堆栈来加载数据。抱歉不要把这个问题的描述。我已经用我的问题更新了这个问题。 –