最近はちょこちょこと前に作ったライブラリの改修をしたり、TravisCIやHoundCIを導入したりしています。
それでずっとやろうと思って後回しにしていたライブラリの改修をして、無事、アップデートしました。

このライブラリは、Social.frameworkのラッパーライブラリで、Twitter、Facebook、(スキーム起動ですが、)LINEへのテキスト/画像/URLのシェアが簡単に出来るライブラリです。

簡単にアップデートも兼ねて紹介すると、

let shareData = SNSShareData {
    $0.text = "text"
    $0.urls = [NSURL(string: "http://www.yahoo.co.jp")!]
}

shareData.post(.Twitter) { result in
    print(result.done ? "Posted!!" : "Canceled!!")
}

こんな感じでシェアするテキストやURLをSNSShareDataに突っ込んで、postを呼んであげるだけで、
TwitterやFacebookに投稿するポップアップを表示することができます。
LINEの場合は、Scheme起動でシェアすることができます。

また、面倒な、 TwitterやFacebookのアカウントが有効になっているか の判定もできます。
投稿した/投稿キャンセルした/何かしらのエラーが発生したの状態も、resultとして受け取れます。

ちなみに、 v1.0.0 以前は、

let data = SNSShareData(
    text: "abcdef",
    images: [image],
    urls: [url]
)

SNSShare.post(type: .Twitter, data: data, controller: self, completion: { result in
    switch result {
    case .Success:
        print("Posted!!")
    case .Failure(let et):
        print(et)
    }
})

こういう形にしていました。
v1.0.0での変更点としては、

  • SNSShareDataのイニシャライザを、closureのみにした (全項目イニシャライザ的なもの等は全て廃止)
  • SNSShareクラスのpostにdataを渡す方式から、dataにpostの振る舞いを実装してより手軽なものに変更
  • 今まではViewControllerの指定が必要だったが、指定がなければ、UIApplicationのkeyWindowから、最前面に表示されているViewControllerを探してそれを使うようにした

となります。上であげた例の beforeafter を見れば、記述量が減ったのが伺えるかなと思います。
最近いろんなライブラリのコードリーディングをして書き方を調べて、こういう設計にしたい!と思ってトライした結果になります。
とくに、SNSShareDataのイニシャライザにclosureを採用したことで、使い手が必要なプロパティに対してのみ代入すれば良くなり、
一々、

init(text: String) {

}

init(urls: [NSURL]) {

}

init(text: String, images: [UIImage], urls: [NSURL]) {

}

みたいに複数作る必要もなくなります。(その代償として、イニシャライザにclosureを取る場合はstructではなくてclassにする必要がでてきますが。。)
もし気になったら使ったり、コードを呼んでみたり、issue投げつけたりしてみてください。よろしくお願いします!