> On 22 Oct 2016, at 04:07, Karl <raziel.im+swift-...@gmail.com> wrote: > > >> On 22 Oct 2016, at 04:02, Braeden Profile <jhaezhy...@gmail.com >> <mailto:jhaezhy...@gmail.com>> wrote: >> >> But what would that mean? If I reference `ProtocolName.InnerType`, that >> doesn’t always have meaning. In fact, if you have two different extensions >> where AssociatedType equals something else, there’s a type ambiguity from >> other code. I suspect it would only work if that InnerType was mandated to >> be `private`. > > You would need a reference to a (ProtocolName where AssociatedType == Int), > which you can get either from a `self` inside the extension or from a generic > parameter: > > struct MyValue<T> : ProtocolName { typealias AssociatedType = T } > > let _ = MyValue<Int>().InnerType()
No, wait - sorry, that’s wrong. I got confused for a second. You’re right; it would have to be a private type. > >> >>> On Oct 17, 2016, at 12:44 PM, Adrian Zubarev via swift-evolution >>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >>> >>> That option should not be disallowed. Here is a simple example you might >>> want to build at some point: >>> >>> protocol ProtocolName { >>> >>> associatedtype AssociatedType >>> } >>> >>> extension ProtocolName where AssociatedType == Int { >>> >>> struct InnerType {} >>> } >>> >>> >>> >>> -- >>> Adrian Zubarev >>> Sent with Airmail >>> >>> Am 17. Oktober 2016 um 20:30:58, Karl via swift-evolution >>> (swift-evolution@swift.org <mailto:swift-evolution@swift.org>) schrieb: >>> >>>> Is your vision that each conforming type would have to provide its own >>>> nested type as specified by the protocol? >>>> >>>> Or could the protocol itself define a nested type and anything could use >>>> it? >>>> >>>> protocol FloatingPoint: … { >>>> enum RoundingRule { >>>> // Do I put an implementation here? >>>> } >>>> } >>>> >>>> No, types which are defined inside the protocol are implemented there. >>>> Providing your own types to satisfy a conformance is what associated types >>>> are for. >>>> >>>> If you wanted something like that, you could do it with a nested protocol >>>> + associated type: >>>> >>>> protocol FloatingPoint { >>>> >>>> protocol _RoundingRule { func round(_ : Super) -> Super } >>>> associatedType RoundingRule : _RoundingRule >>>> } >>>> >>>> struct Float : FloatingPoint { >>>> >>>> enum RoundingRule : _RoundingRule { >>>> func round(_ val: Float) -> Float { >>>> /* switch self, perform rounding… */ >>>> } >>>> } >>>> } >>>> >>>> That brings up an interesting point, though - we would need a way to refer >>>> to the outer protocol (I used “Super” here). >>>> >>> >>> >>> _______________________________________________ >>> 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> >> >
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution