SwiftUIおすすめライブラリ

# SwiftUIの使えそうなライブラリ一覧

## アーキテクチャ
### [swift-composable-architecture(TCA)](https://github.com/pointfreeco/swift-composable-architecture)

- 最近流行りのRedux系のアーキテクチャ用のライブラリ
- SwiftUIで規模の大きいアプリを開発するのであれば、第一候補になるのでは？


## 上タブ
### [Parchment](https://github.com/rechsteiner/Parchment)
- ![image](https://camo.githubusercontent.com/e93dc008bd73916022809637d1376729d5b6daf11371a473a0162cf7b0a20c4d/68747470733a2f2f72656368737465696e65722d70617263686d656e742e73332e65752d63656e7472616c2d312e616d617a6f6e6177732e636f6d2f70617263686d656e742d64656c65676174652e676966)
- よく見る上タブを気軽に作成することができる
- 上タブのライブラリは複数ありますが、現在でも活発に更新されているOSS
- SwiftUIにも対応されている(Exampleが用意されている)

## グリッド(コレクションビュー)
### [QGrid](https://github.com/Q-Mobile/QGrid)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/bc819504-aa0a-7f80-585a-2ab4f5c9c330.gif" width=70%>

- UIKitのUICollectionViewのようなライブラリ
- グリッド形式で画面を作成することができる
- SwiftPM対応

### [ASCollectionView](https://github.com/apptekstudios/ASCollectionView)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/be8a57f5-0357-9565-dcc7-509a804a105a.jpeg" width=30%>　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/cd8b10ea-1dcb-8d40-466e-a21684c6120d.jpeg" width=30%>

- SwiftUIでUITableViewとUICollectionViewを拡張したようなライブラリ
- 今のところグリッド形式のライブラリで一番使いやすそう
- かなり頻繁にアップデートがされている印象


### [WaterfallGrid](https://github.com/paololeonardi/WaterfallGrid)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/3b90faf1-2651-36ba-8f84-a10e5833cda1.gif" width=40%>

- グリッド形式で表示できるライブラリ
- QGridと比べて簡単に覚えやすいイメージ
- SwiftPM、CocoaPods対応

## チャート

### [ChartView](https://github.com/AppPear/ChartView)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/e44f44b3-2b62-05eb-a8b8-4c791147b71f.gif" width=40%>　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/442469c6-3e4f-b810-048f-4572c9257270.gif" width=30%>


- SwiftUIで作成されたChartを作成することができる
- SwiftPM対応

### [Swift Sunburst Diagram](https://github.com/lludo/SwiftSunburstDiagram) 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/9b505e2f-7790-0a96-dd1b-78f84ed015c4.png" width=30%>

- 円グラフなどのリッチなUIを作成できるSwiftUIライブラリ

## タブ

### [SSCustomTabbar](https://github.com/simformsolutions/SSCustomTabbar)
<img src="https://raw.githubusercontent.com/simformsolutions/SSCustomTabbar/master/SSCustomTabBar/Screenshots/customTabbar.gif" width=30%>

- SwiftUIで使えるUITabBarの拡張ライブラリ
- UIKitで実装してSwiftUIで使えるようにしたみたいです。

## カレンダー

### [RKCalendar](https://github.com/RaffiKian/RKCalendar)
<img src="https://github.com/RaffiKian/RKCalendar/raw/master/RKCalendar/Images/demo-app-light-mode-1.png" width=30%><img src="https://github.com/RaffiKian/RKCalendar/raw/master/RKCalendar/Images/demo-app-dark-mode-1.png" width=30%>

- SwiftUI製のカレンダーライブラリです。
- UIKitのFSCalendarなどに比べるとカスタマイズ性は劣りますが、現状SwiftUIでは一番良さそう。

## 拡張(Extension)

### [SwiftUIX](https://github.com/SwiftUIX/SwiftUIX)
- SwiftUIを使いやすく様々な拡張をしたライブラリ
- SwiftUIでサポートされてないUIKitのパーツを気軽に使いやすくしてくれる
- とりあえずSwiftUIでアプリ作ってみたい方は必須のライブラリ 
- SwiftPM対応

### [DynamicColor](https://github.com/yannickl/DynamicColor)
<img src="https://camo.githubusercontent.com/807829622d111e30b50fba217dcca647192508ec/687474703a2f2f79616e6e69636b6c6f72696f742e636f6d2f7265736f75726365732f64796e616d6963636f6c6f722d73616d706c652d73637265656e73686f742e706e67" width=30%><img src="https://camo.githubusercontent.com/3549e99a68544fcd0bc3d56a3ea6bd6537f233dd/687474703a2f2f79616e6e69636b6c6f72696f742e636f6d2f7265736f75726365732f64796e616d69636772616469656e742d73616d706c652d73637265656e73686f742e706e67" width=30%>
- SwiftUI版Colorの拡張ライブラリ
- とりあえず入れておけば色の設定は問題なし
- SwiftPM、CocoaPods、Carthage対応


### [KingfisherSwiftUI](https://github.com/onevcat/Kingfisher)
- UIKitの有名画像キャッシュライブラリがSwiftUIにも対応しています。

```swift
import KingfisherSwiftUI

var body: some View {
    KFImage(URL(string: "https://example.com/image.png")!)
}
```

### [PartialSheet](https://github.com/AndreaMiotto/PartialSheet)

<img src="https://user-images.githubusercontent.com/11211914/68700576-6c100580-0585-11ea-847b-99f0450311a4.gif" width=30%><img src="https://user-images.githubusercontent.com/11211914/68700574-6c100580-0585-11ea-9727-8a02ec36b118.gif" width=30%>

- サイズをカスタマイズできるモーダルシートをモディファイアとして提供

```swift
YourView
.partialSheet(
    presented: Binding<Bool>, 
    backgroundColor: Color = Color.white, 
    handlerBarColor: Color = Color.gray, 
    enableCover: Bool = true, 
    coverColor: Color = Color.black.opacity(0.4), 
    view: @escaping () -> SheetContent) -> some View where SheetContent : View
```

## ウォークスルー

### [ConcentricOnboarding](https://github.com/exyte/ConcentricOnboarding)

- ボタンタップ形式のウォークスルー画面を作成することができる
- SwiftUIでは数少ないウォークスルーライブラリ
- CocoaPodsとCarthageのみ対応

## UIKit関連(SwiftUIにないものをUIKitでサポート)


### [Keyboard Observing](https://github.com/nickffox/KeyboardObserving)
- キーボードを監視してくれる軽量ライブラリ

### [SwiftUIRefresh](https://github.com/siteline/SwiftUIRefresh)
- SwiftUIでPull To Refreshを実現してくれる軽量ライブラリ
- SwiftPM対応

## テスト
### [ViewInspector](https://github.com/nalexn/ViewInspector)
- SwiftUIビューを単体テストするためのライブラリ

```swift
func testVStackOfTexts() throws {
    let view = VStack {
        Text("1")
        Text("2")
        Text("3")
    }
    let values = try view.inspect().map { try $0.text().string() }
    XCTAssertEqual(values, ["1", "2", "3"])
}
```

## サンプルコード・サンプルアプリ
### [SwiftUI-Cheat-Sheet](https://github.com/SimpleBoilerplates/SwiftUI-Cheat-Sheet)
- 最新のSwiftUIのコードの書き方をREADME.mdに書いてくれている
- SwiftUIだとどうやって書けばいいんだっけ？ってなった時に便利



## まとめ
- 2019年に発表されたSwiftUIだが、まだまだ発展途上でバグなども多い。
- まだまだ、公開されている数が少ないためこまめに探し出しおすすめライブラリを更新する予定。
- みなさんもおすすめライブラリが有ればどんどんコメントお願いします！！！

- WWDC2020が開催された直後にSwiftUIの記事を新たに書こうと思います。

## 追記
記事を書いてから2年ほど経ちましたが、現在のSwiftUIは昔と比べてかなり進化しています。
ここで紹介したライブラリを使わなくてもpureで実装出来てしまいます(Pull to refreshなど)
少しずつ更新して行く予定です...

### 10/24 
#### 追加
- swift-composable-architecture(TCA)
- Parchment
- SwiftUI-Cheat-Sheet