例えば、文字列の最後の1文字を削除するようなsubstringを例に、ワーニングが消えるように書き換えたいと思います。"hoge!" にします
実は上記の2つの書き方で戻り値の型が違います。substringの戻り値の型はString、[]の場合はString.SubSequenceが返ってきます。型の違いでエラーになる場合は、Stringで作り直してあげる必要があります
substringの範囲の指定方法としては、以下の5種類ぐらいあるのでしょうかね。