swift2 Swift错误:函式签章中未使用泛型参数'T'

wfsdck30  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(235)

我试图使用泛型来简化一些XML反序列化,但是Swift 2.0却令人窒息地说我没有在方法签名中使用泛型。我很困惑为什么它会抛出这个错误,因为我直接示例化了传入的类类型。关于这个错误的原因有什么建议吗?确切的错误是:
函式签章中未使用泛型参数'T'
MTXMLDeserializable是我正在使用的基类,它具有以下方法:properties.map
下面是违规方法:

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中,它使编译器崩溃,至少现在它抛出了一个错误)。
我可以让这个类的子类传递它们自己的闭包来示例化它们所期望的类型,并为此放弃使用泛型,但我认为这是很好的和干净的,并节省了编写所有那些重写的方法。
谢谢你看一看,任何帮助都是感激不尽的!

a1o7rhls

a1o7rhls1#

你使用了泛型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
}
ut6juiuv

ut6juiuv2#

错误 * 泛型参数'T'未用于函式签章 * 表示方法签章中至少有一个型别必须是该泛型型别,例如

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

}
7fyelxc5

7fyelxc53#

有点脏,但我喜欢

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

相关问题