【发布时间】:2014-06-19 14:24:21
【问题描述】:
我有一个通用函数,它调用 Web 服务并将 JSON 响应序列化回对象。
class func invokeService<T>(service: String, withParams params: Dictionary<String, String>, returningClass: AnyClass, completionHandler handler: ((T) -> ())) {
/* Construct the URL, call the service and parse the response */
}
我想要完成的是这个 Java 代码的等价物
public <T> T invokeService(final String serviceURLSuffix, final Map<String, String> params,
final Class<T> classTypeToReturn) {
}
- 我尝试完成的方法签名是否正确?
- 更具体地说,将
AnyClass指定为参数类型 正确的做法? - 调用该方法时,我将
MyObject.self作为返回类值传递,但我得到一个编译错误“无法将表达式的类型 '()' 转换为类型 'String'”
CastDAO.invokeService("test", withParams: ["test" : "test"], returningClass: CityInfo.self) { cityInfo in /*...*/
}
编辑:
我尝试使用object_getClass,正如holex 所提到的,但现在我得到了:
错误:“类型‘CityInfo.Type’不符合协议‘AnyObject’”
符合协议需要做什么?
class CityInfo : NSObject {
var cityName: String?
var regionCode: String?
var regionName: String?
}
【问题讨论】:
-
我认为 Swift 的泛型不像 java 那样工作。因此推断者不可能那么聪明。 id 省略 Class
事物并明确指定通用类型 CastDAO.invokeService("test", withParams: ["test" : "test"]) { (ci:CityInfo) in } -
我遇到过你的情况,每个人都写过同样的事情——这是不可能的,但是如果你把这里写的所有答案都写下来,你就可以做到这一点,看看我的回答:stackoverflow.com/a/68930681/530884
标签: swift generics type-inference