Swift错误:通用参数';T';函数签名中不使用
我正试图使用泛型来简化一些XML反序列化,然而,Swift 2.0却说我在方法签名中没有使用泛型。我不明白为什么它会抛出这个错误,因为我直接实例化传入的类类型。关于这个错误的原因有什么建议吗?确切的错误是: 函数签名中未使用泛型参数“T” MTXMLDeserializable是我正在使用的基类,它的方法是:Swift错误:通用参数';T';函数签名中不使用,swift,generics,swift2,Swift,Generics,Swift2,我正试图使用泛型来简化一些XML反序列化,然而,Swift 2.0却说我在方法签名中没有使用泛型。我不明白为什么它会抛出这个错误,因为我直接实例化传入的类类型。关于这个错误的原因有什么建议吗?确切的错误是: 函数签名中未使用泛型参数“T” MTXMLDeserializable是我正在使用的基类,它的方法是:init(properties:Dictionary?,propertyMap:Dictionary? 以下是令人不快的方法: func transformResponse<T: MT
init(properties:Dictionary?,propertyMap:Dictionary?
以下是令人不快的方法:
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
}
即使从(T.self作为T.Type).init(properties:objProps,propertyMap:self.propertyMap)
切换到只使用T(properties:objProps,propertyMap:self.propertyMap)
也不能解决问题
我已经就此与swift编译器进行了斗争,并升级到swift 2.0,希望我能以有限的成功绕过这个问题(在swift 1.2中,它使编译器崩溃,至少现在它抛出了一个错误)
我可以让这个类的子类通过它们自己的闭包来实例化它们所期望的类型,并放弃使用泛型来实现这一点,但我认为这很好,很干净,可以省去编写所有被重写的方法
感谢您的关注,感谢您的帮助 您使用generic
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
}
func transformResponse(responseData:XMLIndexer?)->[T]?{
如果让数据=响应数据{
让属性=数据[“正文”]。子项
返回properties.map{
(xmlProps)->T英寸
让objProps=xmlProps.element!.attributes
return(T.self作为T.Type).init(属性:objProps,属性映射:self.propertyMap)
}
}否则{
返回,无
}
例如,函数签名中未使用错误泛型参数“T”,这意味着方法签名中至少有一种类型必须是该泛型类型
func transformResponse<T: MTXMLDeserializable>(responseData: XMLIndexer?, someOtherParameter : T) -> [MTXMLDeserializable]? {
}
func transformResponse(responseData:XMLIndexer?,someOtherParameter:T)->[MTXMLDeserializable]{
}
有点脏,但这对我很管用
func load<T: BaseModel>(rev id: String) -> (String, T?) {
return ("whatever", nil)
}
func加载(版本id:String)->(String,T?){
返回(“无论什么”,无)
}
您给出了另一个示例。显然OP在寻找->[T]?
。但您确实解决了我的难题。
中的任何内容都与方法签名无关。括号内的输入参数(如您的答案所示)获取参数或输出/返回类型的类型必须为T
(如接受答案中所示)
func load<T: BaseModel>(rev id: String) -> (String, T?) {
return ("whatever", nil)
}