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)
}
我正在尝试使用泛型来简化一些 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)
}