【发布时间】:2015-07-11 21:37:39
【问题描述】:
我正在尝试使用泛型来简化一些 XML 反序列化,但是,Swift 2.0 令人窒息地说我没有在我的方法签名中使用泛型。我很困惑为什么它会抛出这个错误,因为我直接实例化传入的类类型。关于这个错误的原因有什么建议吗?确切的错误是:
函数签名中未使用通用参数“T”
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
}
即使从 (T.self as T.Type).init(properties: objProps, propertyMap: self.propertyMap) 切换到仅使用 T(properties: objProps, propertyMap: self.propertyMap) 也不能解决问题。
我已经为此与 swift 编译器进行了斗争,并升级到了 Swift 2.0,希望我能以有限的成功解决这个问题(在 Swift 1.2 中它使编译器崩溃,至少现在它会抛出一个错误)。
我可以让这个类的子类传递它们自己的闭包来实例化他们期望的类型,并为此使用泛型,但我认为这很好而且干净,并且可以节省编写所有这些重写的方法。
感谢您的浏览,感谢您的帮助!
【问题讨论】: