2016-12-03 53 views
1

的阵列我有以下结构创建迅速泛型

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"}) 

我试图为视图控制器想出一个办法来接受资源的不同类型的数组。

任何帮助,将不胜感激。 谢谢

+0

绝对不应该在* view *控制器中加载来自网络的内容。无论如何,你的实际问题是什么? – Alexander

+1

UIViewController子类的自定义初始值设定程序通常不起作用,因为您经常会使用故事板场景或使用init(编码器)的nib来组合泛型与ViewController没有多大意义。 – Paulw11

+0

@Alexander我使用网络堆栈来加载数据。抱歉不要把这个问题的描述。我已经用我的问题更新了这个问题。 –

回答

0

只要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}