Reputation: 3202
I was busy using NSURLProtocolClient
's URLProtocol function:
welf?.client?.URLProtocol(welf!, didReceiveResponse: operation.response, cacheStoragePolicy: NSURLCacheStoragePolicy.NotAllowed)
I was expecting it to return Void
. But to my surprise it returns Void?
Why is it necessary to make a distinction between Void
and Void?
I have read that Void
is a type alias for the empty tuple type. So, does this have something to do with a distinction between the empty tuple type vs nil?
Upvotes: 5
Views: 2686
Reputation: 51911
Note that, ()
and nil
is different:
let a:Void? = ()
let b:Void? = nil
a == nil // -> false
b == nil // -> true
Using this, you can judge the method has really been invoked or not.
let result = welf?.client?.URLProtocol(welf!, didReceiveResponse: operation.response, cacheStoragePolicy: NSURLCacheStoragePolicy.NotAllowed)
if result != nil {
// success
}
else {
// `welf?.client` was `nil`
}
Upvotes: 6
Reputation: 94703
This is simply because you are using Optional Chaining. The method returns Void
, but it is possible for the whole chain to return nil
before the method is ever called.
Essentially, a return value of Void
will mean the call was actually made (self and client both have values) while a nil
result will mean that one of those were nil
.
Upvotes: 7