<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">You may be thinking of something like C#'s `dynamic` type. The C# compiler defers all checks, method resolution and overload resolution at runtime when a `dynamic` object is encountered.</div><div class=""><br class=""></div><div class="">I haven't used it a lot and I don't think that Swift would benefit a lot from it. However, it makes it easier to pick the "best" overload based on the runtime type: if you have Foo methods for 10-15 types, you can do Foo((dynamic)obj) to pick the appropriate one without a type switch.</div><div class="">
<br class="Apple-interchange-newline"><span style="color: rgb(0, 0, 0); font-family: 'Lucida Grande'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;" class="">Félix</span>
</div>

<br class=""><div><blockquote type="cite" class=""><div class="">Le 9 janv. 2016 à 14:21:50, Michael Henson via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; a écrit :</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Right, yes. That makes sense. It's clear to me now that this would require adding the ability to dynamically dispatch / resolve method calls at runtime, which is both a huge architectural change and probably incompatible with Swift's design philosophy, even if the mechanism was well-designed.<br class=""><br class="">The use case that motivated the original idea is still valid, though. This is a problem that is nearly trivial to solve in more dynamic languages, as witnessed in the Objective-C compatibility example, but takes many lines of code and much care to solve properly in Swift.<br class=""><br class="">Mike</div><div class="gmail_extra" style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br class=""><div class="gmail_quote">On Sat, Jan 9, 2016 at 6:35 AM, 肇鑫<span class="Apple-converted-space">&nbsp;</span><span dir="ltr" class="">&lt;<a href="mailto:owenzx@gmail.com" target="_blank" class="">owenzx@gmail.com</a>&gt;</span><span class="Apple-converted-space">&nbsp;</span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"><div dir="ltr" class=""><div class="gmail_default" style="font-family: georgia, serif;">As far as I know, dynamicType is something that doesn't work until the app is running the specific code, which means your codes are no longer protected by the compiler. That is what swift tries to keep you from. So I believe this should not happen in swift at any time. You should use dynamicType as little as possible. You should try generics instead of dynamic type.</div><div class="gmail_default" style="font-family: georgia, serif;"><br class=""></div><div class="gmail_default" style="font-family: georgia, serif;">As you said, you'd better to cast it to a protocol instead of dynamicType.</div><div class="gmail_default" style="font-family: georgia, serif;"><br class=""></div><div class="gmail_default" style="font-family: georgia, serif;">zhaoxin</div></div><div class="gmail_extra"><div class=""><div class="h5"><br class=""><div class="gmail_quote">On Sat, Jan 9, 2016 at 12:55 PM, Félix Cloutier<span class="Apple-converted-space">&nbsp;</span><span dir="ltr" class="">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt;</span><span class="Apple-converted-space">&nbsp;</span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"><div style="word-wrap: break-word;" class=""><div class=""><br class=""></div><div class=""><div class=""></div><blockquote type="cite" class=""><div class="">func magic(_ variable: Any) {</div><div class=""><span style="white-space: pre-wrap;" class="">        </span>let foo = variable as dynamicType</div><div class=""><span style="white-space: pre-wrap;" class="">        </span>// ???</div><div class="">}</div><div class=""><br class=""></div><div class="">magic("hello")</div><div class="">magic(42)</div></blockquote><div class=""><br class=""></div>What would be the result of this? What benefit do I get from casting it to its dynamic type?<br class=""><div class=""><br class=""><span style="font-family: 'Lucida Grande'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; float: none; display: inline !important;" class="">Félix</span></div><br class=""><div class=""><blockquote type="cite" class=""><div class=""><div class=""><div class="">Le 8 janv. 2016 à 23:40:46, Michael Henson via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt; a écrit :</div><br class=""></div></div><div class=""><div class=""><div class=""><div dir="ltr" class="">Currently, the language syntax only allows type identifiers in the type-casting-operator productions:<div class=""><br class=""></div><div class="">" " surrounds a keyword</div><div class=""><br class=""></div><div class="">type-casting-operator -&gt; "is" type</div><div class="">type-casting-operator -&gt; "as" type</div><div class=""><div class="">type-casting-operator -&gt; "as" "?" type</div></div><div class=""><div class="">type-casting-operator -&gt; "as" "!" type</div></div><div class=""><br class=""></div><div class="">The type production doesn't allow for expressions which resolve to a type, only explicit type references.</div><div class=""><br class=""></div><div class="">So, if you want to refer to the item *as* its dynamic type, there's no direct way to do that unless you declare the name of the type in code:</div><div class=""><br class=""></div><div class="">class Example {}</div><div class="">var value: Any = Example()</div><div class="">var again = value as value.dynamicType</div><div class="">// doesn't work because value.dynamicType is an expression</div><div class=""><br class=""></div><div class="">It should be possible to upcast to dynamicType immediately with no chance of failure. To that end, I suggest adding two productions:</div><div class=""><br class=""></div><div class="">type-casting-operator -&gt; "is" "dynamicType"</div><div class="">type-casting-operator -&gt; "as" "dynamicType"</div><div class=""><br class=""></div><div class="">Following along the example above, we could then do:</div><div class=""><br class=""></div><div class="">var nowPossible = value as dynamicType</div><div class=""><br class=""></div><div class="">and have nowPossible be Example.Type.</div><div class=""><br class=""></div><div class="">Possible use cases for this functionality include:</div><div class=""><br class=""></div><div class="">1. Dealing with mixed-type collections from Objective-C code:</div><div class="">&nbsp; &nbsp;@[ @"key1", @5, @"key2", @20, @"key3", @[@"red",@"green",@"blue"]]</div><div class=""><br class=""></div><div class="">2. Taking advantage of type-specific polymorphism without having to modify code:</div><div class=""><br class=""></div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>func handleObject(obj: NSNumber) { print("Number") }</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>func handleObject(obj: NSData) { print("Data") }</div><div class=""><br class=""></div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>func dispatchToHandler(kind: AnyObject) {</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>print("dispatching \(kind.dynamicType)")</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>handleObject(kind as dynamicType)</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>}</div><div class=""><br class=""></div><div class="">I suspect that handling this use case might pose the most difficulties when implementing the feature. It might make the whole thing impossible if there's no way to resolve types at run-time in compiled code. For example, if the dispatcher is in a Framework distributed as a binary and the user does</div><div class=""><br class=""></div><div class="">class MyClass {}</div><div class="">func handleObject(obj: MyClass) { print "Success!" }</div><div class=""><br class=""></div><div class="">let stuff = MyClass()</div><div class="">dispatchToHandler(stuff)</div><div class=""><br class=""></div><div class="">in the project's code, what would happen?</div><div class=""><br class=""></div><div class="">Casting to an intermediate type between the static and dynamic types would fall out naturally, though in that case you'd already have to know the dynamicType and write the explicit intermediate type name in the code. If that much is known then it's possible to cast directly to that intermediate type with existing syntax.</div><div class=""><br class=""></div><div class="">Also, it's worth noting that the "Any" case is only the broadest instance possible. Anything that passes data along as a super type, by using a Protocol as a concrete type specifier, etc. could benefit from this mechanism.</div><div class=""><br class=""></div><div class="">Mike</div></div></div></div><img alt="" width="1" height="1" border="0" style="min-height: 1px !important; width: 1px !important; border-width: 0px !important; margin: 0px !important; padding: 0px !important;" class=""><span class="Apple-converted-space">&nbsp;</span>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div><img alt="" width="1" height="1" border="0" style="min-height: 1px !important; width: 1px !important; border-width: 0px !important; margin: 0px !important; padding: 0px !important;" class=""></div><br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""><br class=""></blockquote></div><br class=""><br clear="all" class=""><div class=""><br class=""></div></div></div><span class="HOEnZb"><font color="#888888" class="">--<span class="Apple-converted-space">&nbsp;</span><br class=""><div class=""><div dir="ltr" class=""><div class=""><br class="">Owen Zhao<br class=""></div></div></div></font></span></div></blockquote></div><br class=""></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=iRI3beHTe3UxYAHTlV3lA38zIPfHMhyuRzgTmGKV6k4oxwTelvIiQ0GX6AG5Abqi53O1dlOg3R-2B6QHof-2FSw44gZNaQqXQES5QnogB489T4I0pfe4Vr7gEtN-2BDwoAdOMZDRZTiIEkTSHbDAAaDKQjWseJMM9BzsltbMHV-2FV6P9fY6m2OZKQduQskQS4vlKV2ncGG26nmokBO6hNrA-2FyMDEowW9G70CDGkG2igQhIth0g-3D" alt="" width="1" height="1" border="0" style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; height: 1px !important; width: 1px !important; border-width: 0px !important; margin: 0px !important; padding: 0px !important;" class=""><span style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""><span class="Apple-converted-space">&nbsp;</span>_______________________________________________</span><br style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:swift-evolution@swift.org" style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">swift-evolution@swift.org</a><br style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family: LucidaGrande; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class=""></body></html>