[英]Create an array of swift generics
我有以下結構
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以接受一組資源並在添加視圖控制器之前加載它們。
我在閱讀本教程時遇到了這個問題。
對於Instance,假設我有以下資源
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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.