I keep seeing collections brought up whenever this is discussed, so my question 
is: Have you found a broader use for variance annotations in the Swift you 
write?  Even in Objective-C (perhaps due to their relative obscurity) I don't 
see (non-Foundation) people make use of the variance annotations for generic 
classes, so it makes me think we could just implement this as an extension to 
the collection casting machinery instead of exposing a Scala-esque variance 
notation.  Sort of like how it was done before when subtyping was introduced 
for function types around 2.x IIRC.

~Robert Widmann

2016/12/08 19:45、Braeden Profile via swift-evolution 
<[email protected]> のメッセージ:

> Has the core team or the community considered the possibility of implementing 
> covariant/contravariant generic types?  It would really be appreciated.
> 
> I know with Array, vague-ifying or specific-ifying the type ([Int] to [Any]) 
> has help from the compiler―and we can use `map` if all else fails―but that 
> only lessens the impact of the missing functionality.  This is my exact use 
> case here, using SceneKit to identify the first-hit Controller object:
> 
> class ControllerNode<Controller: AnyObject>: SCNNode
> {
>       let controller: Controller
> }
> 
> // Ordered front to back, returns the first Controller object.
> for hit in hitTest
> {
>       // Determine if this node is part of a controller.
>       let ancestrySequence = sequence(first: hit.node, next: { $0.parent })
>       let lastControllerNode: ControllerNode<AnyObject>? = 
> ancestrySequence.reduce(nil)
>               { ($1 as? ControllerNode) ?? $0 }
>       
>       if let cabinet = lastControllerNode?.controller as? CabinetController
>               { return cabinet }
>       
>       if let wall = lastControllerNode?.controller as? WallController
>               { return wall }
> }
> 
> This compiles, but unfortunately, this will never work.  The `reduce` 
> algorithm always ends up trying to convert things like 
> `ControllerNode<WallController> as ControllerNode<AnyObject>`, 
> which―unintuitively―always fails.  Without compiler help, so would things 
> like `myIntArray as [Any]` or `Optional<Boy>(Boy()) as Optional<Human>`.
> 
> If Swift is supposed to welcome generic programming, this would be a great 
> thing to have.
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to