SwiftのStringのindexのがわかりづらい件

SwiftのStringをsubstringしようとするとき、
いつもやり方を忘れてしまい、調べてしまう。
しかも、入力するときにうまく補完が効かなかったりして、イライラするー!

例えば、年月日を良く切り出すので、それをまとめておく。
Stringのインデックスは、下の図の、下段の数字のようになっている。

下にソースコードを記載したが、2017-06-05の場合、
インデックスは0から10まである。
startIndexは0となり、
endIndexは10となる。

substring(to:)で年を取得する場合は、
4文字目まで欲しいので、4文字目と5文字目の間のインデックス4(開始から4つめ)を指定する。

substring(from:)で日を取得する場合は、
9文字目から欲しいので、8文字目と9文字目の間のインデックス8(後ろから2つ前)を指定する。

substring(with:)で月を取得する場合は、
6文字目と7文字目が欲しいので、
5から7で指定する。
インデックスで指定しているということを意識すれば、
5...7ではなくて、5..<7にするというのも、
なんとなく、そうなんかなと思う。