gpt4 book ai didi

swift - 泛型执行请求,使用泛型

转载 作者:行者123 更新时间:2023-11-28 06:56:12 24 4
gpt4 key购买 nike

我想使用泛型快速执行请求函数。我想调用电话并根据我得到的结果打开我的枚举结果。但是,我不明白:'无法使用类型为 (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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com