Unpopular opinion: assertions are great, but should only be used for problems that cannot be detected immediately at runtime.
E.g. there’s no need to check that an Optional is non-nil before force-unwrapping it, or that an index is contained within the bounds of a Collection; the Swift runtime is _guaranteed_ to trap for these. All you’re doing is adding clutter.
And obviously the best strategy remains to architect your code so that you don’t have to force-unwrap or access unsafe indices in the first place — but in these rare situations where you have no choice *and* an explanation is not warranted, assertions are clutter.
@layoutSubviews combining the 2 posts above, I'd say assertions are useful for the in betweens. eg. when you import code/library, you use asserts (preconditions right?) so your own code is clean