Objective-C has no safe collections for non-object values. If you want an array of ints, for example, you either get to use a C array with lots of manual management and potential for error, or you use an NSArray of NSNumbers and pay for a bunch of overhead.<p>It has very poor support for custom value types. Objective-C structs basically can&#x27;t contain object pointers, so they&#x27;re limited to simple things like CGRect. They also can&#x27;t contain methods, so you end up writing associated code in global functions.<p>Protocols are extremely limited. They&#x27;re basically just collections of method declarations. There&#x27;s no way to add functionality to every class which conforms to a protocol.<p>Objective-C is often verbose to the point of painful redundancy. Consider:<p><pre><code>    NSString *x = [NSString stringWithFormat: @&quot;%d&quot;, number];
</code></pre>
Versus:<p><pre><code>    let x = String(format: &quot;%d&quot;, number)
</code></pre>
Other examples include having to write the signature of every public method twice (once in the header and once in the implementation) and the need to do an annoying `self = [super init]` dance in every initializer.<p>There&#x27;s almost no functional programming stuff available, like map and reduce. This is not strictly a language complaint, but since the standard libraries are pretty tightly woven in, I think it still counts.<p>Generics support is really limited. What&#x27;s there was only added to interoperate better with Swift, anyway!<p>That&#x27;s a quick overview of some of the ways Swift improves on ObjC. I&#x27;m sure there&#x27;s more.