> On 15 Nov 2016, at 14:59, Karl <[email protected]> wrote:
>> On 15 Nov 2016, at 12:22, Haravikk via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>> What's different about having the method return nil vs being optional? 
>> You're attempting to call it either way, and presumably need some means of 
>> handling the return value, except in Swift it's all nice and explicit and 
>> easy to put in a conditional like:
>> 
>>      if let result = myObject.someOptionalMethod() { /* Do some stuff */ }
>>      print(myObject.someOptionalStringMethod() ?? "")
>> 
>> And so-on. If you need a method to be both optional, and return a nilable 
>> result then you can use a double optional like so:
>> 
>>      if let result = myObject.someDoubleOptionalMethod() { // Method was 
>> implemented
>>              if let value = result { // Method returned a value
>>                      /* Do some stuff */
>>              }
>>      }
>> 
>> 
>> By defining the methods as returning an Optional and throwing in default 
>> implementations you can specify fewer, bigger protocols and make clear what 
>> the requirements really are, though personally given the choice I'd prefer a 
>> dozen smaller protocols that are absolutely explicit in what they do.
>> 
>> But yeah, I think the tools you need are all there already; maybe there's an 
>> argument to be made for allowing default return values on protocol methods, 
>> to reduce the boiler-plate?
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> I think there is a difference between:
> 
> - A method which returns an optional result, and
> - An optional method which, if present, always returns a result
> 
> Perhaps not so much of a difference at the usage site (it’s just a question 
> of placing a ? for optional chaining), but semantically and when conforming 
> to the protocol, they mean different things.

Maybe, but it just seems like default implementations do everything that 
optional methods require, it's just not got a shorthand to make it easier.

Really the question is, do we adopt the optional keyword for non @objc methods, 
along with the special syntax for calling them (it's not exactly the same as 
chaining). Personally though I'd rather do the opposite and do away with both, 
and have @objc optional methods replaced by default implementations somehow.

The question then is how; simply making the methods optional (return type 
becomes optional, or more optional) is not the best solution as testing 
optionality isn't a one-size-fits-all solution. For example, API designers may 
prefer to return a method's non-implemented state with a specific int or enum 
case, or by throwing an exception or producing an error. You can do all of 
these things with default implementations.

Otherwise you could allow specifying of default return values within a protocol 
itself, functionally this would be identical to adding a default 
implementation, just a bit easier for the simplest case, I'm not sure it 
warrants special treatment though.


I mean, when it comes down to it an optional method is just one that might do 
nothing; but a default implementation that returns a default value or has no 
body achieves this just as effectively. The only advantage here is the 
call-site semantics, but you can enforce the same by having an optional return 
value if that's required.

Put another way, I don't see what's gained by the first of these two:

        foo.someOptionalMethod?() // @objc optional method
        foo.someMethod() // default implementation is empty

You've attempted to call both, and in both cases it just won't do anything. 
Your knowing that doesn't really change anything. Meanwhile if you have a 
return value:

        if let result = foo.someOptionalMethod?() { /* Process result * / }
        if let result = foo.someMethod() { /* Process result */ } // default 
implementation returns nil


If just doesn't seem like such a special case to require special treatment when 
Swift's optional support is already really good and encapsulates the same 
ideas, and the void case just needs a default implementation that's a no-op. 
Plus by using a default implementation you have more flexibility overall in how 
you actually respond when a method isn't implemented.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to