可以使用泛型

时间:2015-09-02 15:27:05

标签: swift generics

我有一个协议调用Decodable

public protocol Decodable {
    typealias DecodedType = Self
    static func decode(e: Extractor) -> DecodedType?
}

我有一个函数decode

public func decode<T: Decodable where T.DecodedType == T>(object: AnyObject) -> T? {

另外,我有一个班级RestApiResponseParser

class RestApiResponseParser<T where T:Decodable> {
    private func createServerModels(response: ServerResponse) -> Result<T> {
        var parsingError:NSError?
        let link: T? = decode(response)
        ...
    }
    ...
}

typealias ServerResponse = [String: AnyObject] 我试着称之为:

let responseParser = RestApiResponseParser<MyModel>(responseData: inputObject as! NSData)
let processError = responseParser.processResponseData()

不幸的是,我收到编译时错误:

enter image description here

是不是意味着,我不能在泛型类中使用泛型函数?

1 个答案:

答案 0 :(得分:1)

是的,您可以在泛型类中使用泛型函数。您的问题是您将[String: AnyObject]字典(这是一个结构,而不是AnyObject)传递给期望AnyObject的函数。看起来您需要使用其密钥从字典中提取AnyObject

if let object = response["<insert your key here>"] {
    decode(object)
}

另一种方法是将您的ServerResponse投放到NSDictionary这是一个类,因此可以作为AnyObject传递:

let link: T? = decode(response as NSDictionary)

顺便说一下,DictionaryNSDictionary之间的桥接并不像#34;无数&#34;正如Apple声称的那样 - 我遇到过这样的情况,我无法弄清楚为什么Swift无法为我自动桥接它们,当我必须明确时。你注意到的那些不一致。你的函数会将Dictionary作为一个参数,而不是另一个,没有明确的理由。也许这与您使用typealias这一事实有关,但我不确定。