【问题标题】:Swift error: Generic parameter 'T' is not used in function signatureSwift 错误:函数签名中未使用通用参数“T”
【发布时间】: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 中它使编译器崩溃,至少现在它会抛出一个错误)。

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

感谢您的浏览,感谢您的帮助!

【问题讨论】:

    标签: swift generics swift2


    【解决方案1】:

    您使用泛型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】:

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

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

      【讨论】:

      • 你举了另一个的例子。显然,OP 正在寻找-&gt; [T]?。但你确实解决了我的难题。 &lt;&gt; 中的任何内容都与方法签名无关。 要么括号内的输入参数(如您的答案所示),它采用参数或输出/返回类型必须为T 类型(如已接受的答案所示)
      • @vadian,为什么 Swift 需要这个?我不想用它作为论据:(
      【解决方案3】:

      它有点脏,但这对我有用

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

      【讨论】:

        猜你喜欢
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多