> On Feb 2, 2017, at 3:46 PM, Rex Fenley <r...@remind101.com> wrote:
> 
> My use case is RLMArray and it can't implement RangeReplaceableCollection 
> though because `init` is unavailable, additionally, there's a lot of parts to 
> the protocol that would take some time to implement correctly if I could. 
> They offer a Swift type List that wraps RLMArray and does a bunch of stuff to 
> implement RangeReplaceableCollection, but they discourage using their Swift 
> library in mixed Obj-C/Swift projects and certain model objects simply 
> couldn't use the List type anyway because they're also used in Obj-C and List 
> is not @objc compliant.
> 
> So this leaves me in situations where when I need to use Array or RLMArray I 
> have to duplicate my code, not just in one place, but all the way down a 
> pipeline in order to have my generics work with either 
> RangeReplaceableCollection or RLMArray.
> 
> If I could abstract the commonalities required by my application, I could 
> just have a RLMArrayProtocol that has RLMArray's exposed function signatures 
> and a new protocol Appendable = RangeReplaceableCollection | RLMArrayProtocol 
> and this will type check all the way through the pipeline.
> 
> tl;dr - if a function signature required by a protocol is marked unavailable 
> on a class, then disjunction is necessary in order to bridge the two (or 
> more) types without duplicating code.

You should be able to solve this problem today by creating a custom protocol 
that you use as a constraint in your generic code and providing conformances 
for both Array and RLMArray.

> 
> On Thu, Feb 2, 2017 at 1:35 PM, Matthew Johnson <matt...@anandabits.com 
> <mailto:matt...@anandabits.com>> wrote:
>> 
>> On Feb 2, 2017, at 3:26 PM, Rex Fenley via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> Hello, I believe there was some discussion about this quite awhile ago. I 
>> was wondering if there's any interest in including a protocol 'or' type that 
>> would be the intersection of two protocols. This could be really useful in 
>> situations where a framework that the user has no control over implements a 
>> portion of some often used protocol. Such as specialized collections from an 
>> Database framework that don't implement RangeReplaceableCollection but have 
>> a set of methods that are equivalent. The user can then implement a protocol 
>> that is the intersection of those set of methods and not duplicate code.
> 
> If the specialized collection in the database framework already provides 
> functionality equivalent to `RangeReplaceableCollection` what you really want 
> to do is just provide the conformance you’re looking for in an extension:
> 
> extension SpecializedDatabaseCollection: RangeReplaceableCollection {
>    // if necessary, provide forwarding wrappers where the member names don’t 
> match up.
> }
> 
> But in a case like this the framework itself really should provide this 
> conformance out of the box.  If they didn’t, maybe there is a good reason so 
> you would want to find out why it wasn’t provided.
> 
> Is there something you’re hoping to do that you can’t solve by simply 
> extending the framework types?
> 
>> 
>> Simplified example:
>> 
>> protocol Animal {
>>     var hasEars: Bool { get }
>>     func grow()
>> }
>> 
>> protocol Plant {
>>     var isGreen: Bool { get }
>>     func grow()
>> }
>> 
>> protocol LivingThing = Plant | Animal // or a different syntax
>> 
>> LivingThing's is as follows
>> {
>>     func grow()
>> }
>> 
>> -- 
>> Rex Fenley  |  IOS DEVELOPER
>> 
>> 
>> Remind.com <https://www.remind.com/> |  BLOG <http://blog.remind.com/>  |  
>> FOLLOW US <https://twitter.com/remindhq>  |  LIKE US 
>> <https://www.facebook.com/remindhq>_______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> 
> 
> 
> -- 
> Rex Fenley  |  IOS DEVELOPER
> 
> 
> Remind.com <https://www.remind.com/> |  BLOG <http://blog.remind.com/>  |  
> FOLLOW US <https://twitter.com/remindhq>  |  LIKE US 
> <https://www.facebook.com/remindhq>
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to