はじめに
文字列の日付を桁揃え(yyyy/mm/dd)しようとして、こんな感じで書いてみたところ・・・
let str2 = "2020/7/1"
let array = str2.split(separator: "/")
if (array.count >= 3){
let str3 = array[0]+"/"+String(format: "%02d", Int(array[1]))+"/"+String(format: "%02d", Int(array[2]))
}
Int(array[1])) のところで、以下のようなエラーが出ました。
Initializer 'init(_:)' requires that 'String.SubSequence' (aka 'Substring') conform to 'BinaryInteger'
String.SubSequenceとは?
String.SubSequenceって何?ってことで公式ページを見ると「typealias SubSequence = Substring」となっているので、Substringのページを見てみる。
Overview
When you create a slice of a string, a Substring instance is the result. Operating on substrings is fast and efficient because a substring shares its storage with the original string. The Substring type presents the same interface as String, so you can avoid or defer any copying of the string’s contents.概観
文字列のスライスを作成すると、Substringインスタンスが結果になります。サブストリングは元のストリングとストレージを共有するため、サブストリングの操作は高速で効率的です。 SubstringタイプはStringと同じインターフェースを提供するため、文字列の内容のコピーを回避または延期できます。
つまりString.split()の戻り値が、StringではなくSubstringになっているらしい。typeを確認してみると、確かにSubstringの配列になっていた。
let array = str2.split(separator: "/")
print(type(of: array))
Array<Substring>
SubStringをStringに変換すれば問題なさそうなので、以下のようにコードを書き換えました。
let str2 = "2020/7/1"
let array = str2.split(separator: "/")
print(type(of: array))
if (array.count >= 3){
let str3 = array[0]+"/"+String(format: "%02d", Int(String(array[1]))!)+"/"+String(format: "%02d", Int(String(array[2]))!)
}
これで正しく変換できました。
"2020/07/01"
まとめ
この辺はたぶんはSwift4でStringがコレクション化されたことによるのかなと思われます。
以下、参考リンクです。
実行環境
- Xcode 11.2.1(Playgroundで実行)