Swift error: Generic parameter 'T' is not used in function signature

Swift error: Generic parameter 'T' is not used in function signature

我正在尝试使用泛型来简化一些 XML 反序列化,但是,Swift 2.0 令人窒息地说我没有在我的方法签名中使用泛型。我很困惑为什么会抛出这个错误,因为我直接实例化了传入的 class 类型。关于这个错误的原因有什么建议吗?确切的错误是:

Generic parameter 'T' is not used in function signature

MTXMLDeserializable 是基础 class 我正在使用并且有方法: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 中它崩溃了编译器,至少现在它会抛出一个错误。

我可以让这个 class 的子classes 传递他们自己的闭包来实例化他们期望的类型并为此放弃使用泛型,但我认为这很好,干净而且节省了编写所有这些重写的方法。

感谢您的浏览,我们将不胜感激!

您使用泛型 T 但您没有在方法主体的任何地方使用它。这就是错误所在。

例如它可能应该看起来像:

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
}

错误Generic parameter 'T' is not used in function signature表示方法签名中至少有一个类型必须是那个泛型类型,例如

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

}

有点脏,但这对我有用

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