古い記事だけど見逃してたので軽くまとめ
https://developer.apple.com/swift/blog/?id=11
protectedは実質的に何も保護していない
サブクラスは新しいpublicなproperty/methodを経由して、protectedなAPIを外部に公開できてしまう
Appleフレームワークはどうなの
Appleフレームワークにもサブクラスから呼び出されることを期待しているAPIがあるが、
- サブクラス以外から呼んでも意味が無いAPI
- 継承されるが直接呼び出されることは想定していないデザインのAPI (drawRectはUIKit以外から呼ばれない)
というケースがほとんどで、その場合protectedがあると便利なことがあるか、というと特にない
extensionとの兼ね合い
protectedを導入すると、
- クラスのextensionから、protectedなAPIは呼べるようにすべきか?
- サブクラスのextensionから、スーパークラスのprotectedなAPIは呼べるようにすべきか?
などの問題が発生し、複雑さが増してしまう。
わかりやすさ重視
swiftのアクセスコントロールは、
- class外からのアクセス可能性
- framework外からのアクセス可能性
という軸のみでデザインされている。
ここに、さらに「継承関係」という新たな軸は追加したくない。ややこしくなるから。
swiftのアクセスコントロールは理解のしやすさを優先しており、
この設計がシンプルで実用上問題ないものと信じている