This makes more sense already. But in this case, wouldn't I be interested, as a 
client, in creating my own TextStreams, some of which might write to a custom 
log file, to a web service, etc... ?

> On 19 Feb 2017, at 17:00, Karl Wagner <razie...@gmail.com> wrote:
> 
> 
>> On 19 Feb 2017, at 16:17, David Hart via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> I still don't see the use case for this. Perhaps I'm wrong, but if an API 
>> creates a protocol for the sole purpose of representing a set of concrete 
>> types, that looks more to me like bad API design, and not a missing feature 
>> in the language. Can you give me a small concrete real-world example of an 
>> API which requires that? 
> 
> 
> Whether or not a protocol is open is also a part of API expressivity; often a 
> library will want to expose a protocol only as a way to enable 
> generic/existential programming over a fixed set of types, without intending 
> that any clients add new conformers. Protocols are crucial to expressing the 
> shared patterns amongst the set of types.
> 
> For example, I might have a TextStream protocol:
> 
> public protocol TextStream {
>     func write(_: String)
> }
> 
> And I might decide to expose a property as type “TextStream” purely because I 
> reserve the right to change the underlying concrete type. I want clients to 
> work on the protocol-existential level.
> 
> public class Component {
>     var debugWriter: TextStream
> }
> 
> By doing that, the underlying concrete type is no longer part of my API or 
> ABI. I can change it between versions without breaking clients, but it’s not 
> meaningful for any clients to create their own TextStreams; that’s not part 
> of what my library does/allows.
> 
> - Karl
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to