Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Trying to mock NSURLConnection
protocol URLSessionDataTaskProtocol {
func resume()
}
extension NSURLSessionDataTask: URLSessionDataTaskProtocol { }
typealias DataTaskResult = (NSData?, NSURLResponse?, NSError?) -> Void
protocol URLSessionProtocol {
func dataTaskWithURL(url: NSURL, completionHandler: DataTaskResult) -> URLSessionDataTaskProtocol
}
extension NSURLSession: URLSessionProtocol { } // ERROR: Type 'NSURLSession' does not conform to protocol 'URLSessionProtocol'
@eliperkins
Copy link

I don't have complete context around this, but I think this gets you most of the way there:

//: Playground - noun: a place where people can play

import Foundation

protocol URLSessionDataTaskProtocol {
    func resume()
}

extension NSURLSessionDataTask: URLSessionDataTaskProtocol { }

typealias DataTaskResult = (NSData?, NSURLResponse?, NSError?) -> Void

protocol URLSessionProtocol {
    typealias Task
    func dataTaskWithURL(url: NSURL, completionHandler: DataTaskResult) -> Task
}

extension NSURLSession: URLSessionProtocol { }

@briancroom
Copy link

Cool idea with the typealias, @eliperkins. I think the drawback to that approach is that it prevents URLSessionProtocol from being used as a concrete type, so a client wanting to use the service would have to become generic.

I'd suggest this variation for @joemasilotti:

protocol URLSessionDataTaskProtocol {
    func resume()
}

extension NSURLSessionTask: URLSessionDataTaskProtocol {}

protocol URLSessionProtocol {
    func dataTaskWithURL(url: NSURL, completionHandler: DataTaskResult) -> URLSessionDataTaskProtocol
}

typealias DataTaskResult = (NSData?, NSURLResponse?, NSError?) -> Void

extension NSURLSession: URLSessionProtocol {
    func dataTaskWithURL(url: NSURL, completionHandler: DataTaskResult) -> URLSessionDataTaskProtocol {
        return (dataTaskWithURL(url, completionHandler: completionHandler) as NSURLSessionDataTask) as URLSessionDataTaskProtocol
    }
}


func useSession(session: URLSessionProtocol) {
    session.dataTaskWithURL(NSURL(string: "http://apple.com")!, completionHandler: { (data, response, error) in
        print("Data: \(data), response: \(response), error: \(error)")
    }).resume()
}

useSession(NSURLSession(configuration: .defaultSessionConfiguration()))

@joemasilotti
Copy link
Author

This does work, thanks @briancroom!

@ltrainpr
Copy link

ltrainpr commented Nov 21, 2016

@briancroom @joemasilotti Do you guys have Swift 3 version of this? I'm getting a Type 'URLSession' does not conform to protocol 'URLSessionProtocol' on the extension URLSession: URLSessionProtocol line.

Also getting Expressions are not allowed at the top level on useSession( line.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment