Substringを使ったSwiftのコードを見ていて、疑問になる部分がありました。
こんな感じのコードです。
1 2 3 4 5 6 7 8 9 10 11 | var str: Substring? = .init( "Hello World" ) func removeFromBack(_ x: Substring) -> Substring? { [ "hello" , "world" ] .compactMap({ x.hasSuffix($0) ? x.dropLast($0.count) : nil}) .first } while str != "" , let ss = str.flatMap(removeFromBack) { str = ss } |
SubstringなのにSubstring?にしているのは何故なんだろうと思いました。
いろいろ調べていくと、SwiftのOptional型について理解が深まりました。
結論
- Optionalにすることで、removeFromBack関数の中でSubstringを扱うことができる
Optionalの型についてmapやflatMapを使うと、その中ではOptionalを外した形でアクセスできます。
この例ではそれを上手く使って、removeFromBackにSubstringを渡して後ろから文字を検索して順次削除していました。
(Substring)を使う場合だと、mapに渡されるものはCharactorになってしまいます。
人のソースコードを読むと勉強になります。
0 件のコメント :
コメントを投稿