Cloud9999Strife
Cloud9999Strife

Reputation: 3202

Swift - Optional Void

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

Answers (2)

rintaro
rintaro

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

drewag
drewag

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

Related Questions