> On 19 Feb 2017, at 17:36, David Hart <da...@hartbit.com> wrote:
> 
> 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 
> <mailto:razie...@gmail.com>> wrote:
> 
>> 
>>> On 19 Feb 2017, at 16:17, David Hart via swift-evolution 
>>> <swift-evolution@swift.org <mailto: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

Perhaps, but there are times when you don’t want that, or when accommodating 
custom instances is not so straightforward. The debugWriter instance is only 
_exposed_ as a “TextStream”; but there may be more (internal) requirements on 
the underlying instance - e.g. that it is Flushable, 
InitialisableFromNativeFileObject, or whatever. I would rather not expose them 
all, and just expose the instance as “something which is a TextStream, so you 
can call TextStream methods on it”, if I decide that’s all they need to know.

- Karl 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to