The problem is that Swift guarantees that initialization is done safely, but Obj-C does not. In this case, both initWithFrame and initWithCoder are designated initializers, so implementing one in your subclass requires you to implement the other. (If you don't re-define initWithFrame in your subclass, you inherit both initializers, so the problem doesn't arise.)
You have to understand that initialization in Obj-C has always been unsafe, but that we used standard patterns to ward off the crashes. Unfortunately, that is truly patterns, not a pattern. The rules for what to do in a subclass varied from class to class, and you just had to somehow know what worked and what didn't. This was not merely a theoretical problem.
With Swift, there are safety guarantees, and following the rules is like stopping at stop signs on roads with no traffic — you're perfectly safe to ignore them, until you're dead.
Unfortunately, there are a few "old school" cases where initialization APIs designed for Obj-C were convenient enough without the rules, but don't work really well in Swift. NSCoding is one, NSWindowController is another, and NSDocument is a third that's even more annoying.
The easiest solution is to live with the pain. Alternatively, it's pretty straightforward to write Obj-C intermediate subclasses that reorganize the initializers, and inherit from these subclasses for all your real subclasses. For example, you can make a UIView subclass that turns initWithCoder into a convenience initializer. I'm not sure that it's worth it, since the Swift compiler will insert the missing initializer for you with a fix-it, but you can.