iOS 自分用ライブラリ紹介×6

この記事は CAMPHOR- Advent Calendar 2017 19日目の記事です。

私用だったり業務用だったりで実装した iOS 開発向けのライブラリをいくつか切り出して公開したのでご紹介です。 誰かの役に立ったらうれしいです。

目次

BetterUserDefaults

github.com

Notification の Notification.Name のように UserDefaults のキーも文字列でなく UserDefaults.Key 型で定義したものを使えるようにしたもの。

import BetterUserDefaults

extension UserDefaults.Key {
    static let sampleKeyA = UserDefaults.Key("sampleKeyA")
    static let sampleKeyB = UserDefaults.Key("sampleKeyB")
}

UserDefaults.standard.set(true, for: .sampleKeyA)
UserDefaults.standard.set(123, for: .sampleKeyB)

UserDefaults.standard.bool(for: .sampleKeyA)       // true
UserDefaults.standard.integer(for: .sampleKeyB)    // 123

UIViewBorders

github.com

UIView の四辺に任意の色・太さのボーダーが付けられる Extension 。ボーダー自体も UIView なので AutoLayout による親ビューの動的なサイズ変更にも対応してる。

view.addBorderViews(positions: [.left, .bottom], color: .red, width: 3)

UIViewBorders

KeyboardFriendlyScrolling

github.com

キーボードの高さの分だけスクロールビューの contentInset.bottom を設定してくるもの。scrollView とキーボードのフレームを window 上の座標に変換・比較して被ってる高さを計算しているので scrollView が画面いっぱいじゃなくてもちゃんと動くはず。

import UIKit
import KeyboardFriendlyScrolling

class ViewController: UIViewController {
    private var keyboardFriendlyScrollController: KeyboardFriendlyScrollController?

    @IBOutlet private weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()
        keyboardFriendlyScrollController = KeyboardFriendlyScrollController(viewController: self, scrollView: scrollView).start()
    }
}

CopyLinkActivity

github.com

iOS の共有先に「リンクをコピー」ボタンを置くための UIActivity。

import UIKit
import CopyLinkActivity

class ViewController: UIViewController {
    @IBAction func didTapShareButton(_ sender: UIButton) {
        let linkURL = URL(string: "https://www.apple.com/")!
        let activityViewController = UIActivityViewController(activityItems: [linkURL], applicationActivities: [CopyLinkActivity()])
        activityViewController.completionWithItemsHandler = { [weak self] (activityType, completed, _, _) -> Void in
            if completed && activityType == CopyLinkActivity.defaultActivityType {
                let alert = UIAlertController(title: "Copied", message: linkURL.absoluteString, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                self?.present(alert, animated: true)
            }
        }
        present(activityViewController, animated: true)
    }
}

標準で用意されている共有先にも「コピー」はあるけど iOS 11.1 でバグってて activityItems に文字列と URL を両方渡すと URL が無視されて文字列のみがクリップボードにコピーされてたりしたので URL のみをちゃんとコピーできるものを作った。

不具合の様子

RFC3339DateFormatter

github.com

サーバーが「RFC3339 フォーマットで送るね〜」って言ってもわりと柔軟な仕様なので、揺れがあってもパースできるような DateFormatter を作った。仕様は RFC 3339 - Date and Time on the Internet: Timestamps に従って実装している。

Date from String

import RFC3339DateFormatter

// with T, nanosecond
RFC3339DateFormatter.date(from: "2017-01-01T00:00:00.000Z")
RFC3339DateFormatter.date(from: "2017-01-01T09:00:00.000+09:00")
// with T
RFC3339DateFormatter.date(from: "2017-01-01T00:00:00Z")
RFC3339DateFormatter.date(from: "2017-01-01T09:00:00+09:00")
// with ` `, nanosecond
RFC3339DateFormatter.date(from: "2017-01-01 00:00:00.000Z")
RFC3339DateFormatter.date(from: "2017-01-01 09:00:00.000+09:00")
// with ` `
RFC3339DateFormatter.date(from: "2017-01-01 00:00:00Z")
RFC3339DateFormatter.date(from: "2017-01-01 09:00:00+09:00")
// different number of digits of nanosecond
RFC3339DateFormatter.date(from: "2017-01-01 00:00:00.0Z")

Date to String

import RFC3339DateFormatter

RFC3339DateFormatter.string(from: Date()) // "2017-12-01T06:25:11.029Z"

気持ち

EasyButton

github.com

シンプルなボタンを簡単に作れるもの。メインの色を指定するとハイライト時の色も勝手に計算して設定してくれるのがステキポイント。

// Set a darker color than the background color to the highlighted background color automatically
let lightColorButton = UIButton.button(title: "Hello World", titleColor: .white, backgroundColor: .orange, cornerRadius: 6)

// Set a lighter color than the background color to the highlighted background color automatically
let darkColorButton = UIButton.button(title: "Hello World", titleColor: .white, backgroundColor: .darkGray, cornerRadius: 6)

上記の他に下記の関数も生えるので単品でも使える。

extension UIButton {
    public func setBackgroundColor(color: UIColor, for state: UIControlState)
    public func setBackgroundColor(color: UIColor, highlightedColor: UIColor? = nil)
    public func setCornerRadius(radius: CGFloat)
    public func setup(title: String? = nil, titleColor: UIColor, backgroundColor: UIColor, highlightedColor: UIColor? = nil, cornerRadius: CGFloat = 0)
}

アドベントカレンダー振り返り

振り返るとこの Advent Calendar も2014年から毎年参加していて4年目になります。

来年もよろしくお願いいたします。

Minecraft のマルチプレイ用サーバをプレイ時だけ稼働させるための Lambda Function

三行

  • Minecraft サーバはメモリ2GB以上のインスタンスが欲しいけど VPS を借りると月2000円ぐらいかかるところが多い
  • プレイ時だけ稼働させればよいので Slack からインスタンスを立てて遊び終わったらデータを退避させて壊せるようにした
  • $0.03 / hour で遊べる

minecraft-lambda-function

Minecraft サーバをプレイ時だけ稼働させるために下記の機能を持つ AWS Lambda Function を作った。

  • create: DigitalOcean にサーバインスタンスの生成 → S3 からプレイデータ(worldディレクトリ)のダウンロード → Minecraft サーバの起動 → IP アドレスを Slack に通知
  • upload: S3 へプレイデータをアップロード
  • destroy: インスタンスの破壊
続きを読む

Swift っぽい UserDefaults

Swift 3 の Notification

Swift 3 から Notification.Name 型が追加され、Notification の名前に生の文字列ではなく Notification.Name 型の値を指定できるようになった。

extension Notification.Name {
    static let userLoggedOut = Notification.Name("UserLoggedOut")
}
let n = Notification(name: .userLoggedOut, object: nil)

参考: Swift 3 以降の NotificationCenter の正しい使い方

Swift っぽい UserDefaults

UserDefaults のキーはまだ生の文字列を使っているけど、新しい Notification のようなインターフェイスで扱えたらうれしいなと思って薄いライブラリを書いた。

github.com

続きを読む

遺伝的アルゴリズムでやっていく Mario AI Competition 2009

この記事は CAMPHOR- Advent Calendar 2016 19日目の記事です。

Mario AI Competition 2009 とは

Mario AI Competition 2009Sergey KarakovskiyJulian Togelius という研究者の方が主催していたらしい大会で、スーパーマリオブラザーズ(を模したゲーム)を自動操作する AI を作ってスコアを競うというもの。スーパーマリオランではありません。

続きを読む

MISTEL BAROCCO MD600 買った

これ 😉👇✨ mistel barocco md600

巷で Ergodox が流行っていて、左右で分かれているタイプのキーボードがちょっと気になってた。左右を離すことによって胸を開いた自然な姿勢でタイプできて楽らしい。

続きを読む

zsh 時間のかかるコマンド実行が終了したら通知センターに通知する

コマンド実行に5秒以上かかったときだけ通知センターにコマンドの終了を通知するようにします。

image

続きを読む

Xcode プロジェクトをシュッと開く Alfred Workflow

中で mdfind を叩いて *.xcworkspace *.playground *.xcodeproj を検索し、選択したファイルを Xcode で開く Workflow です。

iOS 開発者の方には最高便利だと思うのでお使いください。

Download

f:id:morishin127:20160910234218p:plain