试图在Swift中传递Generic类型作为参数

Muh*_*med 5 generics swift alamofire

我正在使用AlamofireObjectMapper 我需要创建一个带有这样的Generic参数的函数:

func doSomething < T : BaseMappable > (myCustomClass : T) 
{
    Alamofire.request("url", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: APIKeys().AuthorizedHeader).responseObject(completionHandler: { ( response :DataResponse<T>) in

             let data = response.result.value

            if let array = data?.objects
            {
                for ar in array
                {
                   self.allPromotions.append(ar)
                }
            }

        })


}
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

使用未声明的类型'myCustomClass' 编辑, 因为你们在评论中回答我我修复了错误但是当我试图调用这个方法时我得到了另一个错误

我这样称呼方法

doSomething(myCustomClass: Promotions)
Run Code Online (Sandbox Code Playgroud)

但我有另一个错误

参数类型'Promotions.Type'不符合预期类型'BaseMappable'

这是我的促销课程

import ObjectMapper


class Promotions : Mappable  {





        var id:Int?
        var workshop_id:Int?
        var title:String?
        var desc:String?
        var start_date:String?
        var expire_date:String?
        var type:String?

        var objects  = [Promotions]()




        required init?(map: Map){

        }

        func mapping(map: Map) {
            id <- map["id"]
            workshop_id <- map["workshop_id"]
            title <- map["title"]
            desc <- map["desc"]
            start_date <- map["start_date"]
            expire_date <- map["expire_date"]
            type <- map["type"]
            objects <- map["promotions"]
        }




}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题

小智 8

您需要将通用类型 T 的类型作为参数传递。尝试更改

myCustomClass : T
Run Code Online (Sandbox Code Playgroud)

经过

myCustomClass : T.Type
Run Code Online (Sandbox Code Playgroud)

结果将如下所示:

斯威夫特 4:

    func doSomething<T>(myCustomClass : T.Type) where T : BaseMappable
    {
        Alamofire.request("url", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: APIKeys().AuthorizedHeader).responseObject(completionHandler: { ( response :DataResponse<T>) in

                 let data = response.result.value

                if let array = data?.objects
                {
                    for ar in array
                    {
                       self.allPromotions.append(ar)
                    }
                }

            })
    }
Run Code Online (Sandbox Code Playgroud)

然后,您应该调用该方法:

doSomething(myCustomClass: Promotions.self)
Run Code Online (Sandbox Code Playgroud)


Tha*_*ipe 6

只需传递Promotions.self作为参数即可。

doSomething(myCustomClass: Promotions.self)
Run Code Online (Sandbox Code Playgroud)

这将克服您在函数调用中遇到的错误。


Dáv*_*tor 1

myCustomClass 只是 的输入参数的名称doSomething。泛型类型的名称是T,因此 DataResponse 应该是DataResponse<T>