作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用泛型快速执行请求函数。我想调用电话并根据我得到的结果打开我的枚举结果。但是,我不明白:'无法使用类型为 (NSURLRequest, (Result<__>) -> ()) 的参数列表调用 performRequest' 为什么我不能在此处使用未命名参数?我还尝试了类似以下的操作:r<MyStruct> --- 但随后出现预期的表达式错误。非常感谢任何解释上述 Result<_> 错误的帮助。谢谢。
enum Result<A> {
case Value
case Error
}
func performRequest<A>(request:NSURLRequest, callback:(Result<A>) -> ()) {
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
callback(parseResponse(data, response: response, error: error))
}
task.resume()
}
class SampleClass {
let request = NSURLRequest(URL: NSURL(string: "www.google.com")!)
init() {
performRequest(request) { r in -------- errors out
switch r {
case .Value:
case .Error:
}
}
最佳答案
问题是当您使用 performRequest
时,您没有向编译器提供有关您打算使用的通用参数的足够信息。缺少的关键部分是 parseResponse
需要返回一个以与回调相同的方式参数化的 Result
。但是,在您提供的代码段中,parseResponse
不是通用的。
我相信这会如您所愿。在这种情况下,我将 Result
参数化为 String
,但您可以替换为任何其他类型。
// multi-purpose (generic) Result type
enum Result<A>
{
case Value(A) // because you parameterised the enum, you might as well take advantage of the type
case Error
}
// this is a custom parser, you may substitute your own that returns a different type
func parseString( data:NSData?, response:NSURLResponse?, error:NSError? ) -> Result<String> {
if let _ = error {
return Result.Error
}
return Result.Value("Success")
}
// this function is completely generic, but the parser and callback need to be compatible
func performRequest<A>( request:NSURLRequest,
parser:( NSData?, NSURLResponse?, NSError? ) -> Result<A>,
callback:( Result<A> ) -> Void ) {
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
( data, response, error ) -> Void in
callback( parser( data, response, error ) )
}
task.resume()
}
let request = NSURLRequest(URL: NSURL(string: "www.google.com")!)
// actual invocation, now I need to pass in a concrete parser and callback with a specific type
performRequest( request, parser: parseString ) { // parseString returns a Result<String>
r in
switch r {
case .Value( let value ):
// because I passed in a parser that returns a Result<String>, I know that "value" is a String here
print( "Succeeded with value: \(value)" )
break;
case .Error:
print( "an error occurred" )
break;
}
}
关于swift - 泛型执行请求,使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33579738/
我是一名优秀的程序员,十分优秀!