2015-07-11 58 views
1

我想用泛型來簡化一些XML反序列化,但是,Swift 2.0令人窒息,說我沒有在我的方法簽名中使用泛型。我很困惑,爲什麼它拋出這個錯誤,因爲我直接實例化傳入的類類型。對此錯誤的原因有任何建議?確切的錯誤是:Generic parameter 'T' is not used in function signature使用泛型參數時出現Swift錯誤

MTXMLDeserializable是我使用的基類,有方法:init(properties: Dictionary<String, String>?, propertyMap: Dictionary<String, String>?)

這裏是有問題的方法:

func transformResponse<T: MTXMLDeserializable>(responseData: XMLIndexer?) -> [MTXMLDeserializable]? { 
    if let data = responseData { 
    let properties = data["body"].children 
    return properties.map { 
     (xmlProps) -> MTXMLDeserializable in 
     let objProps = xmlProps.element!.attributes 
     return (T.self as T.Type).init(properties: objProps, propertyMap: self.propertyMap) 
    } 
    } else { 
    return .None 
    } 

思考,它可以使用被窒息封閉的通用內部傳遞給properties.map我重寫了這樣的方法:

func transformResponse<T: MTXMLDeserializable>(responseData: XMLIndexer?) -> [MTXMLDeserializable]? { 
    if let data = responseData { 
    let properties = data["body"].children 
    let objs = NSMutableArray() 
    for xmlProps in properties { 
     let objProps = xmlProps.element!.attributes 
     let obj = (T.self as T.Type).init(properties: objProps, propertyMap: self.propertyMap) 
     objs.addObject(obj) 
    } 
    return objs as! NSArray 
    } else { 
    return .None 
} 

即使sw從(T.self as T.Type).init(properties: objProps, propertyMap: self.propertyMap)癢到​​僅僅使用T(properties: objProps, propertyMap: self.propertyMap)不能解決問題。

我已經與swift編譯器在這方面進行了戰鬥,並升級到Swift 2.0希望我可以解決這個問題,但成功有限(在Swift 1.2中它使編譯器崩潰,至少現在它拋出一個錯誤)。

我可以讓這個類的子類傳遞它們自己的閉包來實例化它們期待的類型,並使用泛型爲此,但我認爲這很好,乾淨並且節省了編寫所有這些重寫的方法。

感謝您的關注和任何幫助表示讚賞!

回答

4

您使用通用T但您不在方法主體中的任何位置使用它。這就是錯誤所在。

E.g.它可能應該看起來像:

func transformResponse<T: MTXMLDeserializable>(responseData: XMLIndexer?) -> [T]? { 
    if let data = responseData { 
     let properties = data["body"].children 
     return properties.map { 
      (xmlProps) -> T in 
      let objProps = xmlProps.element!.attributes 
      return (T.self as T.Type).init(properties: objProps, propertyMap: self.propertyMap) 
     } 
    } else { 
     return .None 
} 
4

誤差通用參數「T」在功能簽名不使用意味着至少一個類型在方法簽名必須是通用類型的,例如

func transformResponse<T: MTXMLDeserializable>(responseData: XMLIndexer?, someOtherParameter : T) -> [MTXMLDeserializable]? { 

} 
+1

你給** **的另一個例子。顯然,OP正在尋找' - > [T]?'。但你確實解決了我的難題。無論在「<>」裏面,與方法簽名無關。 **或者**括號內的輸入參數(如答案中所示),其中參數或輸出/返回類型必須是「T」類型(如接受的答案中所示) – Honey

0

這是一個有點髒,但是這對我的作品

func load<T: BaseModel>(rev id: String) -> (String, T?) { 
    return ("whatever", nil) 
}