There's been a constant push and pull on ObjC bridging since Swift 1.x, trying to seek a balance but always swaying in the other direction.
Swift has evolved since 1.x to have a fluctuating amount of magic/implicit bridging from ObjC and Foundation types, sometimes going in the opposite direction towards very explicit type conversions.
We've started seeing more of what the "steady state" looks like as Swift 3.x/4.x development matures.
In the early days, Swift users would need deep compiler internal implementation details to know which NSNumber-representable type could implicitly convert. As of SE-0139 that's a lot clearer.
The subtleties of unenforced protocol conformance semantics: https://oleb.net/blog/2016/12/protocols-have-semantics/