Xcode11からiOSアプリ開発にも使えるようになり、先日リリースされたXcode12ではかなり使いやすくなったSwiftPackageManager(以下、SwiftPM)について、プロジェクトへの導入方法とSwiftPMへ自作ライブリを作成方法のうち、この記事は自作ライブラリ作成方法になります。
↓導入方法はこちら
##ライブラリ作成方法
###導入環境
- Xcode12
###SwiftPM起動
[ Xcode起動 ] → [ File ] → [ New ] → [ Swift Packages ]
[ プロジェクト名 ] → [ Cleate ]
作成された画面
今回はあくまで自作ライブラリの登録までなので、
- Package.swift
- MyLibrary.swift
しか、触れません。(本当だったら、テストも書いた方がいいです。)
Package.swiftに、読み込みたい対象のファイルや外部ライブラリのURLを記載します。
今回は、外部ライブラリでNukeを読み込み、UIImageをExtensionして、UIImage側でNukeのLoadを行ったものを作ります。
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "MyLibrary",
platforms:[.iOS(.v11)], // 使用するプラットフォーム(今回はiOS11以上)
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrary"]),
],
dependencies: [
.package(url: "https://github.com/kean/Nuke.git", from: "9.1.2") // 読み込みたい外部ライブラリ
],
targets: [
depends on.
.target(
name: "MyLibrary",
dependencies: [
.product(name: "Nuke", package: "Nuke") // 読み込んだライブラリを使用する
]),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]),
]
)
これで、ライブラリの使用するまでは完了。
import UIKit
import Nuke
public enum ProcessorsOption {
case resize
case resizeRound(radius: CGFloat)
case resizeCircle
}
public typealias AspectMode = ImageProcessors.Resize.ContentMode
public extension UIImageView {
func loadUrl(imageUrl: String?,
processorOption: ProcessorsOption = ProcessorsOption.resize,
aspectMode: AspectMode = .aspectFill,
crop: Bool = false,
placeHolder: UIImage? = nil,
failureImage: UIImage? = nil,
contentMode: UIView.ContentMode? = nil) {
guard let url: String = imageUrl,
let loadUrl: URL = URL(string: url) else {
self.image = failureImage
return
}
let resizeProcessor = ImageProcessors.Resize(size: self.bounds.size,
contentMode: aspectMode, crop: crop)
let processors: [ImageProcessing]
switch processorOption {
case .resize:
processors = [resizeProcessor]
case .resizeRound(let radius):
processors = [resizeProcessor, ImageProcessors.RoundedCorners(radius: radius)]
case .resizeCircle:
processors = [resizeProcessor, ImageProcessors.Circle()]
}
let request = ImageRequest(
url: loadUrl,
processors: processors
)
var contentModes: ImageLoadingOptions.ContentModes?
if let mode = contentMode {
contentModes = ImageLoadingOptions.ContentModes.init(success: mode,
failure: mode, placeholder: mode)
}
let loadingOptions = ImageLoadingOptions(placeholder: placeHolder,
failureImage: failureImage, contentModes: contentModes)
Nuke.loadImage(with: request, options: loadingOptions, into: self)
}
}
ライブラリに内容は割愛させてもらいます。
(Nukeの画像ロードとリサイズを行ってくれるものをExtensionにしてみました。)
このままでは、**No such module 'UIKit'**が出ており、ビルドできません。
[ Tests ] → [ MyLibraryTests ] → [ MyLibraryTests.swift ]の中身を変更
ビルドを「MyMac」から「Any Any iOS Device」へ変更
ビルドが成功すれば完成です。
最後に作成したものをGitコマンドやソースツリーを使い、CommitしてTagを付与し、githubにPushすれば完了です。
↑こちらについては、
- https://tyoshikawa1106.hatenablog.com/entry/2016/05/16/230237
- https://backlog.com/ja/git-tutorial/stepup/17/
を、参照してください。
*Tagは[1.0.0]のようにしないとエラーになります。
全体配布を考えられるなら、ライセンスをつけることをお勧めします。
githubでライセンスをつける方法は
を参照ください。
ちなみに、今回作成したものをgithubに公開しています。
よかったらStarでもつけて使ってみてください。
####github
https://github.com/isamiodagiri/ExtendedImageViewWithNuke
↓導入方法はこちらになります。
###参考
###協力
自作ライブラリをSwiftPMに登録する方法で、外部ライブラリを導入する方法だけが参考だけでは分からず、「アプリ道場サロン」の方々にも協力していただきました。
ありがとうございました。