Substringを使ったSwiftのコードを見ていて、疑問になる部分がありました。
こんな感じのコードです。
```c
`gutter:true;
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になってしまいます。
人のソースコードを読むと勉強になります。
### 参考URL
- [ArrayとOptionalのmapは同じです](https://qiita.com/koher/items/68585cff691d87124077)
- [モナドについてSwiftで説明してみた](https://qiita.com/koher/items/12f72f2fc2db7fa709cf)
- [SwiftのOptional型を極める](https://qiita.com/koher/items/c6f446bad54442a28bf4#%E7%AE%B1%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E3%81%8B%E3%82%82%E3%81%97%E3%82%8C%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88)
0 件のコメント :
コメントを投稿