最近はちょこちょこと前に作ったライブラリの改修をしたり、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を探してそれを使うようにした
となります。上であげた例の before と after を見れば、記述量が減ったのが伺えるかなと思います。
最近いろんなライブラリのコードリーディングをして書き方を調べて、こういう設計にしたい!と思ってトライした結果になります。
とくに、SNSShareData
のイニシャライザにclosureを採用したことで、使い手が必要なプロパティに対してのみ代入すれば良くなり、
一々、
init(text: String) {
}
init(urls: [NSURL]) {
}
init(text: String, images: [UIImage], urls: [NSURL]) {
}
みたいに複数作る必要もなくなります。(その代償として、イニシャライザにclosureを取る場合はstructではなくてclassにする必要がでてきますが。。)
もし気になったら使ったり、コードを呼んでみたり、issue投げつけたりしてみてください。よろしくお願いします!