LoginSignup
4
2

More than 3 years have passed since last update.

【Swift】String.SubSequenceとは何か?

Posted at

はじめに

文字列の日付を桁揃え(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で実行)
4
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2