Swift错误:函数签名中不使用通用参数“T”

时间:2015-07-11 21:37:40

标签: swift generics swift2

我正在尝试使用泛型来简化一些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中它崩溃了编译器,至少现在它会抛出错误)。

我可以让这个类的子类传递它们自己的闭包来实例化它们期望的类型,然后使用泛型来做这个,但我认为这很好而且很干净,并且可以节省写入所有这些被覆盖的方法。

感谢您的光临,感谢任何帮助!

3 个答案:

答案 0 :(得分:5)

您使用泛型rbegin但不在方法体中的任何位置使用它。这就是错误所在。

E.g。它可能看起来像:

T

答案 1 :(得分:4)

错误通用参数'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
}

答案 2 :(得分:1)

它有点脏,但这对我有用

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