[swift-evolution] [Proposal] Allow protocols to require functions with default parameter values.

davesweeris at mac.com davesweeris at mac.com
Sat Jan 16 19:51:52 CST 2016

> On Jan 16, 2016, at 17:28, 肇鑫 <owenzx at gmail.com> wrote:
> Hi Dave,
> Like you said, you approach does not solve the bug.
> And this is the bug: If your protocol `Foo` has a function `foo(X)`, and your type has a function `foo(Y)` where Y can be turned into X through the use of default parameters, then it’s impossible for your type to conform to `Foo`, even though you could use it as a `Foo` in your code. In practice, I think this only matters if you’re using “macros” like __LINE__ or something as your default parameter, but it’s still annoying (to me, anyway).
> ​as this proposal does​.

No, I was saying that (at least at a glance) I didn’t think the original proposal solved the problem I described, and that I thought my “counter” proposal would have all the functionality (albeit from the “other direction”) that Vatsal was proposing *and* fix the glitch.

…Maybe we’re saying the same thing.

> I still think if we can call instance.function(), we should also call (instance as protocol).function(). If we can't, there must be something not right here.
> zhaoxin

You can, as long as your protocol isn’t restricted to only being used as a generic constraint (no Self or typealiases):
protocol Foo {
    func foo() -> String

extension Int : Foo {
    func foo() -> String { return "lovely" }

func bar(x: Any) -> String {
    if x is Foo { return "Here, have some \((x as! Foo).foo()) foo." }
    else        { return "NO FOO FOR YOU!!!" }

print(bar(0))   //Here, have some lovely foo.
print(bar(""))  //NO FOO FOR YOU!!!

- Dave Sweeris

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160116/17f92deb/attachment.html>

More information about the swift-evolution mailing list