<div dir="ltr">Yes, as far as I know &#39;foo&#39; and &#39;foo.self&#39; are equivalent. I don&#39;t actually know why the latter exists, except in analogy to &quot;T.self&quot;.<div><br></div><div>There was a mistake in my response; the metatype of &#39;foo&#39; is not &#39;foo.self&#39;, it is &#39;foo.dynamicType&#39; (or whatever new form dynamicType is going to take in Swift 3).</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jul 9, 2016 at 2:27 PM, Rick Mann <span dir="ltr">&lt;<a href="mailto:rmann@latencyzero.com" target="_blank">rmann@latencyzero.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On Jul 8, 2016, at 09:45 , Austin Zheng &lt;<a href="mailto:austinzheng@gmail.com">austinzheng@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi Rick,<br>
&gt;<br>
&gt; If you have a type (let&#39;s call it &quot;T&quot;), you can use it two ways:<br>
&gt;<br>
&gt; * As a type, or part of a type, like such: &quot;let x : T = blah()&quot;<br>
&gt; * As a value, just like any other variable, function argument, property, etc.<br>
&gt;<br>
&gt; In the second case (type-as-value), you need to append &quot;.self&quot; to the type name according to the grammar:<br>
&gt;<br>
&gt; &quot;let x : Any.Type = T.self&quot;<br>
&gt;<br>
&gt; There was a &quot;bug&quot; in Swift 2.x where you could sometimes use just &quot;T&quot;, without the &quot;.self&quot;, in certain cases (in particular, when you were passing in a type-as-value to a function with one unlabeled argument). That bug has since been fixed.<br>
&gt;<br>
&gt; As for types-as-values: Swift allows you to treat a type as a normal value, which means you can do whatever you want with it: pass it to functions and return it from functions, store it in properties or variables, etc. If you have one of these types-as-values (called &#39;metatypes&#39;), you can do certain things like call static methods or initializers on them, use them to parameterize generic functions, etc.<br>
<br>
</span>Thanks, Austin. I&#39;m familiar with all this in Swift. What threw me was that &quot;subclassObject&quot; was an instance, not a class.<br>
<span class=""><br>
&gt; However, to get back to your original question, the `.self` in that switch statement actually isn&#39;t necessary and you should really just be switching on the value of subclassObject itself, not the value of its type.<br>
<br>
</span>I would have thought so, but the response to this answer was something along the lines of &quot;I never know when to use the object or its self.&quot;<br>
<br>
To me, for an instance, foo an foo.self should be equivalent in all respects (shouldn&#39;t it?).<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;<br>
&gt; Best,<br>
&gt; Austin<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Jul 8, 2016 at 9:38 AM, Rick Mann via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt; I just saw a question which brought up something I didn&#39;t know about. Apparently sometimes you have to call object.self in a place that looks like you should just use &quot;object.&quot; What does this usage mean?<br>
&gt;<br>
&gt; for subclassObject in objects {<br>
&gt;     switch subclassObject.self {        &lt;--- Here, why not &quot;subclassObject&quot; alone?<br>
&gt;     case is Subclass1:<br>
&gt;         doSomethingWith(subclassObject as! Subclass1)<br>
&gt;<br>
&gt;     case is Subclass2:<br>
&gt;         doSomethingWith(subclassObject as! Subclass2)<br>
&gt;<br>
&gt;     case is Subclass3:<br>
&gt;         doSomethingWith(subclassObject as! Subclass3)<br>
&gt;<br>
&gt;     default:<br>
&gt;         break<br>
&gt;     }<br>
&gt; }<br>
&gt;<br>
&gt; Thanks,<br>
&gt; Rick<br>
&gt;<br>
&gt; &gt; On Jul 8, 2016, at 08:15 , Dan Loewenherz via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; To my knowledge, you can’t do exactly what you’re trying to do, but this is close:<br>
&gt; &gt;<br>
&gt; &gt; for subclassObject in objects {<br>
&gt; &gt;     switch subclassObject.self {<br>
&gt; &gt;     case is Subclass1:<br>
&gt; &gt;         doSomethingWith(subclassObject as! Subclass1)<br>
&gt; &gt;<br>
&gt; &gt;     case is Subclass2:<br>
&gt; &gt;         doSomethingWith(subclassObject as! Subclass2)<br>
&gt; &gt;<br>
&gt; &gt;     case is Subclass3:<br>
&gt; &gt;         doSomethingWith(subclassObject as! Subclass3)<br>
&gt; &gt;<br>
&gt; &gt;     default:<br>
&gt; &gt;         break<br>
&gt; &gt;     }<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; On Fri, Jul 8, 2016 at 10:11 AM, Nate Birkholz via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt; &gt; This looks like it doesn&#39;t work (swift 2.x), but wanted to be sure it&#39;s not supported:<br>
&gt; &gt; class Superclass {}<br>
&gt; &gt; class Subclass1 : Superclass {}<br>
&gt; &gt; class Subclass2 : Superclass {}<br>
&gt; &gt; class Subclass3 : Superclass {}<br>
&gt; &gt;<br>
&gt; &gt; let sc1 = Subclass1()<br>
&gt; &gt; let sc2 = Subclass2()<br>
&gt; &gt; let sc3 = Subclass3()<br>
&gt; &gt;<br>
&gt; &gt; let objects : [Superclass] = [sc1, sc2, sc3]<br>
&gt; &gt;<br>
&gt; &gt; for subclassObject in objects {<br>
&gt; &gt;     switch subclassObject {<br>
&gt; &gt;     case let object = subclassObject as? Subclass1:<br>
&gt; &gt;         doSomethingWith(object)<br>
&gt; &gt;     case let object = subclassObject as? Subclass2:<br>
&gt; &gt;         doSomethingWith(object)<br>
&gt; &gt;     case let object = subclassObject as? Subclass3:<br>
&gt; &gt;         doSomethingWith(object)<br>
&gt; &gt;     default:<br>
&gt; &gt;         return<br>
&gt; &gt;     }<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; This gives an error, expecting a colon (:) after object on every case.<br>
&gt; &gt;<br>
&gt; &gt; I wanted to be sure I wasn&#39;t missing something in my syntax (nor some obvious-to-others reason this isn&#39;t supported) before going to swift evolution.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; --<br>
&gt; &gt; Nate Birkholz<br>
&gt; &gt;<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; swift-users mailing list<br>
&gt; &gt; <a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
&gt; &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; swift-users mailing list<br>
&gt; &gt; <a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
&gt; &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Rick Mann<br>
&gt; <a href="mailto:rmann@latencyzero.com">rmann@latencyzero.com</a><br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; swift-users mailing list<br>
&gt; <a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
&gt;<br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
Rick Mann<br>
<a href="mailto:rmann@latencyzero.com">rmann@latencyzero.com</a><br>
<br>
<br>
</font></span></blockquote></div><br></div>