[swift-evolution] Protocol non-conformance clause

Thorsten Seitz tseitz42 at icloud.com
Fri Apr 29 12:45:11 CDT 2016


No problem, that still works, because the most specific implementation is chosen:

protocol A { func foo()}
protocol B {} // empty protocol

extension A  {
    func foo() {
        print("Self is A")
    }
}

extension A where Self: B {
    func foo() {
        print("Self is B")
    }
}

// Works
struct S1: A, B {}
S1().foo() // Self is B

struct S2: A {}
S2().foo() // Self is A


// Wu's example works, too

struct ThirdParty {
    func foo() {
        print("Self is ThirdParty")
    }
}

extension ThirdParty : A {}

ThirdParty().foo() // Self is ThirdParty


// dynamic dispatch works, too

let a1: A = S1()
a1.foo() // Self is B

let a2: A = S2()
a2.foo() // Self is A

let a3: A = ThirdParty() // Self is ThirdParty
a3.foo()


-Thorsten


> Am 29.04.2016 um 17:20 schrieb Erica Sadun <erica at ericasadun.com>:
> 
> In Wux's example, he has third party code:
> 
> ```
> Type ThirdParty {
>     func foo() { print("from third party") }
> }
> ```
> 
> Then in his own code, he defines protocol A and extends it:
> 
> extension A {
>     func foo() {
>         print("Self is B")
>     }
> }
> 
> and conforms ThirdParty to A. But he wants the original  foo() implementation. Your approach
> for writing an extension for plain A without a where clause doesn't offer that solution. The goal
> here is "Add this default behavior *only* where a type does not conform to B"
> 
> -- E
> 
> 
>> On Apr 29, 2016, at 9:10 AM, Thorsten Seitz <tseitz42 at icloud.com <mailto:tseitz42 at icloud.com>> wrote:
>> 
>> Just writing an extension for plain A without a where clause works.
>> 
>> -Thorsten 
>> 
>> Am 29.04.2016 um 16:03 schrieb Erica Sadun via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>>:
>> 
>>> Gmane is down as far as my browser is concerned and I haven't found anything by Googling.
>>> 
>>> Given the following:
>>> 
>>> protocol A {func foo()}
>>> protocol B {} // empty protocol
>>> 
>>> extension A where Self:B {
>>>     func foo() {
>>>         print("Self is B")
>>>     }
>>> }
>>> 
>>> // Works
>>> struct S1: A, B {}
>>> S1().foo()
>>> 
>>> Is there a way to produce a similar extension that exempts any type that conforms to B?
>>> 
>>> cc'ing in Wux because this is a direct response to a scenario he brought up yesterday.
>>> 
>>> -- E
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160429/9271df6d/attachment.html>


More information about the swift-evolution mailing list