> On Aug 17, 2016, at 11:36 AM, Charles Srstka via swift-evolution > <[email protected]> wrote: > >> On Aug 17, 2016, at 12:02 PM, Vladimir.S via swift-evolution >> <[email protected] <mailto:[email protected]>> wrote: >> >> On 17.08.2016 13:00, Boris Wang via swift-evolution wrote: >>> The problem is that: >>> protocol should not be a type, but it is a type sometime and not type >>> sometime now. >>> >>> for exam: >>> P.Type not same as T.Type >>> >>> But you can declare a variable of type P. >>> >>> Protocol should be a contract only, no instances of it. >> >> I'm also confused about this. Tried to follow the whole discussion of >> experienced(as I understand) developer Charles and a member of core team, >> and saw that even experienced developer had some troubles to understand all >> the catches of protocols in Swift. >> >> How we want to make less experienced developers to understand Swift's model >> of protocols&conformance&generic&existentials&etc.. While problems begins >> with the most used Equatable/Hashable protocols.. >> >> Also I believe the syntax of generic constraints in 'where' part is >> confusing. I'm about this: >> >> func pick<PepperType:Sequence>(peppers: PepperType) where >> PepperType.Iterator.Element == Pepper >> >> If '== Proto' means *exactly* typed as such protocol("let arr : [Proto] = >> .."), so IMO ': Proto' should means *typed* as exactly this protocol or any >> derived protocol("let arr : [ProtocolDerivedFromProto] = .."). Just in >> symmetry with class types in 'where' clause here. >> >> Currently, how to specify 'protocol Proto or its derived protocols" ? > > Basically, the issue is that as things currently stand, there is no way to > specify that. Your options basically boil down to: 1) implement the method > twice, 2) force the caller to cast to the protocol first, or 3) just use an > array. > >> I suggest to discuss changing the rules for 'where' generic filter for >> protocols: >> >> 1. Don't allow syntax ': P' or '== P' for protocols. Such syntax should be >> allowed only for classes, structs & other value types. >> >> 2. For protocol introduce 'is P' syntax, which should mean 'typed exactly as >> P, or its derived protocol, or as concrete type conformed to P'. I.e.: >> >> func pick<PepperType:Sequence>(peppers: PepperType) where >> PepperType.Iterator.Element is Pepper >> >> 3. If it is hard to implement (2) today in the "right" way, implement it >> with two copies of the same function, one with ":P" and one with "==P"(was >> discussed earlier in thread) > > This looks identical to my pitch, only with the operator named “is” instead > of “:==“. Unfortunately, we now have Word of God that the Swift team wants to > avoid cloning functions à la C++ templates, so it may be a bit of a > non-starter.
I’m not the Word of God, nor am I on the core team, I just work here and stating my opinions on the matter ;-) Slava > > Charles > > _______________________________________________ > swift-evolution mailing list > [email protected] <mailto:[email protected]> > https://lists.swift.org/mailman/listinfo/swift-evolution > <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
