Swift で String を Data にするときのちょっとしたテクニック

Swift の話です。

今日は String を Dataに変換したい時に使えるちょっとしたテクニックを紹介したいと思います。

String を Data に変換したいときには以下のように書くことが多いと思います(僕調べ)。

// data の型は Optional<Data> になる
let data = "some string".data(using: .utf8)

この方法だと得られる data は Optional なので実際に使うときには if let したり guard let したり ? したりする必要があります。

ちょっとしたテクニック

今回紹介するテクニックは Optional にならないように Data にする方法です。

// data の型は Data になる
let data = Data("some string".utf8)

なぜ nil にならない?

先に紹介した "some string".data(using:) はどのようなときに nil になるのでしょうか?

それは "ああ".data(using: .ascii) のように指定した encoding で表現できない文字列を data に変換しようとしたときに nil になります。

そのため、"some string".data(using: .utf8) のように UTF-8 で指定した場合はそもそも nil になりません(UTF-8 はどんな文字でも表現できるので)。

なので、 UTF-8 の data 表現でいい場合(おそらく殆どの場合は問題ない)は Data("some string".utf8) を使ったほうが unwrap する手間がなくなるのでおすすめです。

典型的な場面

例えばテストコードで Web API のレスポンス用にダミーの JSON の data を作りたい場合にコードをスッキリ書くことが出来ます。

// このように書くよりも
guard let let dummyJSON = "{ \"key\":\"value\"}".data(using: .utf8) else { fatalError("") }

// このように書いてしまったほうが良い
let dummyJSON = Data("{ \"key\":\"value\"}".utf8)

ブログ書くの頑張れ id:yanacii