Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 快速数组类型_Ios_Arrays_Swift_Generics - Fatal编程技术网

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