自作ライブラリのSwift Package Manager(SwiftPM)対応

# はじめに
ついにでた公式のiOSライブラリ管理ツールSwift Package Manager !!!

最近やっと自作ライブラリを対応したので方法について記載します。

* [CocoaPods対応](https://qiita.com/am10/items/9097dd87c4eaa6ec5350)
* [Carthage対応](https://qiita.com/am10/items/c5e07ac5cad12276d43a)

# 環境
* macOS Mojave 10.14.6
* Xcode11.0 
* swift5

# やり方
[これ(AMNowClockView)](https://github.com/adventam10/AMNowClockView)を例に導入してみます。

1. ライブラリのファイルを作成  
とりあえずライブラリの本体（クラス）を作成します。今回でいうとAMNowClockView.swiftファイル。  
2. 外部アクセスするクラスやプロパティにpublic修飾子をつける  

	```swift
	public class AMNowClockView: UIView {
	  public var clockBorderLineWidth: CGFloat = 5.0
	}
	```
	何も修飾子をつけない場合、```internal```になるので外部からアクセスしたいものには全て```public```修飾子をつける必要がある。
3. Swift Packageの作成  
<img width="300" alt="pm_1" src="https://user-images.githubusercontent.com/34936885/66762480-0591bc00-eee1-11e9-9714-0e6fcab42126.png">

4. Package.swiftをライブラリに追加  
<img width="228" alt="pm_2" src="https://user-images.githubusercontent.com/34936885/66762492-0de9f700-eee1-11e9-91a7-72cfb2cdfb89.png">  
作成したPackageからPackage.swiftだけを取り出してライブラリに追加する。

5. Package.swiftを修正する  

	```swift
	let package = Package(name: "AMNowClockView",
                        platforms: [.iOS(.v9)],
                        products: [.library(name: "AMNowClockView", 
                                            targets: ["AMNowClockView"])],
                        targets: [.target(name: "AMNowClockView",
                                          path: "Source")],
                        swiftLanguageVersions: [.v5])
	```

6. gitにpushする  
最終的に下記のような構成。

	```
	.
	├── .gitignore
	├── .swiftpm
	├── Source
	│   └── AMNowClockView.swift
	├── Package.swift
	├── LICENSE
	└── README.md
	```

7. gitにタグをpushする  
1.0.0とか適当にタグをつけてpushする。どうやらx.x.xの形式じゃないと認識されない模様。適当に2.0とタグをつけていたら認識されませんでした。

これでライブラリのSwiftPM対応は完了

# 導入方法
1. Xcodeの追加したいプロジェクトでPROJECT -> Swift Packages -> +  
もしくは File -> Swift Packages -> Add Package Dependency...  
<img width="300" alt="pm_01" src="https://user-images.githubusercontent.com/34936885/66762512-1e9a6d00-eee1-11e9-8b2e-44164386d86c.png">
2. ライブラリのURLを入力  
`https://github.com/adventam10/AMNowClockView` と入力しNextをクリックする。  
<img width="400" alt="pm_02" src="https://user-images.githubusercontent.com/34936885/66762731-7f29aa00-eee1-11e9-9432-74db38f79c45.png">
3. バージョンやブランチを選択する  
ライブラリがSwiftPM対応をしてタグが正しく設定されていればVersionのところに初期設定が入る。（2.0とかタグをつけてるとバージョン指定で導入できませんでした。）
設定が終わればNextをクリックする。  
<img width="400" alt="pm_03" src="https://user-images.githubusercontent.com/34936885/66762750-86e94e80-eee1-11e9-8b7e-5fc7a5eb8e30.png">
4. Finish  
Finishをクリックで完了！！めっちゃ簡単  
<img width="400" alt="pm_04" src="https://user-images.githubusercontent.com/34936885/66762799-98325b00-eee1-11e9-85ba-2f4f73d34d1a.png">

導入後のPackageのバージョン変更や削除はPROJECT -> Swift Packagesからできるようです。

Cocoapods、Carthageと比較すると導入めっちゃ簡単！！

[SwiftPMでライブラリを導入したプロジェクト](https://github.com/adventam10/TestSwiftPM)

# 導入後の問題
IBDesignableが効かないみたいです...

下記はそれぞれAMNowClockViewを導入したStoryboardのスクショです。

| Cocoapods | Carthage | SwiftPM |
| --- | --- | --- |
| ![cocoapods](https://user-images.githubusercontent.com/34936885/66763992-df215000-eee3-11e9-8622-7024a308e70a.png) | ![carthage](https://user-images.githubusercontent.com/34936885/66763845-881b7b00-eee3-11e9-89bb-4c663f06d19c.png) | ![swiftPM](https://user-images.githubusercontent.com/34936885/66763854-8e115c00-eee3-11e9-9bfd-95f63b27e972.png) |

しかし、Carthageとは異なりIBInspectableは有効なようです。

# さいごに
さすが公式ツール！！導入はめちゃくちゃ簡単なので是非使っていきたい！！！

画像やxibなどリソースを含むものはSwiftPMでは対応できないようです:disappointed_relieved:

一度バイナリをbase64にして `String` で書き込めばリソースも持てる...ジョークです。

# 参考

* [iOSアプリ開発にSwift Package Managerを使おう]
(https://qiita.com/hironytic/items/09a4c16857b409c17d2c)
* [Swift Package Managerがめっちゃ便利！](https://qiita.com/s-nkmr/items/ba81c1247c15e43c7ea1#_reference-d772f19a1b3c7aa4c13b)