Ios 快速数组类型
我想我应该更清楚,以下是我的课程:Ios 快速数组类型,ios,arrays,swift,generics,Ios,Arrays,Swift,Generics,我想我应该更清楚,以下是我的课程: import Foundation import Alamofire public class BaseService<T> : ServiceRequest { public var requestType: Alamofire.Method = .GET public var path: String = "/" var requireLogin:Bool = fa
import Foundation
import Alamofire
public class BaseService<T> : ServiceRequest {
public var requestType: Alamofire.Method = .GET
public var path: String = "/"
var requireLogin:Bool = false
var consumer:RequestInformer?
public func requestSuccess<T>(request: Request, response: T) {
consumer?.requestSuccess(request, response: response)
}
public func requestFailed(request: Request, error: NSError) {
consumer?.requestFailed(request, error: error)
}
}
extension BaseService where T:Sortable {
func start() {
if requireLogin {
}
//problem is here, T is [CampaignModel] but I need CampaignModel class, not array. NetworkManager.sharedInstance.sendRequest(self,ResponseListModel<T>.self)
}
}
extension BaseService where T:NSObject {
func start() {
if requireLogin {
}
NetworkManager.sharedInstance.sendRequest(self,ResponseModel<T>.self)
}
}
<代码>导入基础
进口阿拉莫菲尔
公共类BaseService:ServiceRequest{
公共变量requestType:Alamofire.Method=.GET
公共变量路径:String=“/”
var requireLogin:Bool=false
var消费者:请求信息者?
公共函数请求成功(请求:请求,响应:T){
消费者?.requestSuccess(请求、响应:响应)
}
公共函数请求失败(请求:请求,错误:N错误){
消费者?.requestFailed(请求,错误:错误)
}
}
扩展BaseService,其中T:可排序{
func start(){
如果需要登录{
}
//问题就在这里,T是[CampaignModel],但我需要的是CampaignModel类,而不是array.NetworkManager.sharedInstance.sendRequest(self,ResponseListModel.self)
}
}
扩展BaseService,其中T:NSObject{
func start(){
如果需要登录{
}
NetworkManager.sharedInstance.sendRequest(self,ResponseModel.self)
}
}
然后我想使用BaseService,如下所示:
import Alamofire
public class ListCampaignService : BaseService<[CampaignModel]> {
override init() {
super.init()
path = "/xxx/yyy.json"
requestType = .GET
}
}
导入Alamofire
公共类ListCampaignService:BaseService{
重写init(){
super.init()
path=“/xxx/yyy.json”
requestType=.GET
}
}
这意味着ListCampaignService返回活动模型数组。但是我必须处理对象返回类型而不是数组,如下所示
import Alamofire
public class SomeOtherService : BaseService<SomeClass> {
override init() {
super.init()
path = "/aaa/bbb.json"
requestType = .GET
}
}
导入Alamofire
公共类SomeOtherService:BaseService{
重写init(){
super.init()
path=“/aaa/bbb.json”
requestType=.GET
}
}
首先尝试以下方法:
func getType<T>(array:[T]) -> T.Type {
return T.self
}
getType(["1", "2", "3"]) // String.Type
getType([1, 2, 3]) // Int.Type
getType([1, "2", 3.0]) // NSObject.Type
getType([[1], [2], [3]]) // Array<Int>.Type
getType([]) // compile time error "Generic parameter 'T' could not be inferred"
func getType(数组:[T])->T.Type{
返回T.self
}
getType([“1”、“2”、“3”])//String.Type
getType([1,2,3])//Int.Type
getType([1,“2”,3.0])///NSObject.Type
getType([[1]、[2]、[3]])//Array.Type
getType([])//编译时错误“无法推断泛型参数“T”
如果您试图从通用数组
获取特定类型的所有对象,您可以像这样扩展数组
:
extension Array {
func itemsOfType<T>() -> [T] {
return self.flatMap { $0 as? T }
}
}
let x = [1, 2, 3, "foo", "bar", NSDate()]
let ints : [Int] = x.itemsOfType() // [1, 2, 3]
let altInts = x.itemsOfType() as [Int] // [1, 2, 3]
let str : [String] = x.itemsOfType() // ["foo", "bar"]
let dates : [NSDate] = x.itemsOfType() // ["May 17, 2016, 6:23 AM"]
扩展数组{
func itemsOfType()->[T]{
返回self.flatMap{$0 as?T}
}
}
设x=[1,2,3,“foo”,“bar”,NSDate()]
让Int:[Int]=x.itemsOfType()/[1,2,3]
将altInts=x.itemsOfType()设为[Int]/[1,2,3]
let str:[String]=x.itemsOfType()/[“foo”,“bar”]
let dates:[NSDate]=x.itemsOfType()/[“2016年5月17日上午6:23”]
如果在函数中使用泛型,它非常简单:
func test<T>(array: [T]) {
// array elements are of type T
print(T.self)
}
如果你来自未来:Swift 3.0将使用
Self
而不是dynamicType
一旦你拥有了类型,你将如何处理它?将使用它进行json到对象映射我想你已经在“澄清”中丢失了这个问题…您可能应该用T.Type
替换Any
。一个人不需要这样做-我想这取决于他以后想用它做什么!没错,这就是为什么我说“应该”,而不是“需要”;)尽管我总是选择可用的最具描述性的类型,而且T.type
比任何
都更具描述性。改变了答案。
let array = [1, 2, 3]
let type = array.dynamicType.Element.self
print(type) // Int.Type