swift_combination を Swift 3.0 に対応させました
Xcode 8.0 がリリースされていたので早速インストールして Swift 3.0 を試してみた。
拙作のライブラリ swift_combination を開いてみると既存のコードを Swift 3.0 のシンタックスにコンバートするか聞かれたので、とりあえずつっこんでみる。
下のコードは配列の長さを指定して 0
で埋めるという処理だが、微妙に API の名前が変わってたりした。
var indices = [Int](count: length, repeatedValue: 0) // before var indices = [Int](repeating: 0, count: length) // after
もう一箇所は for in
を使ってる箇所で enumerate
が enumerated
に変更されている。
for (i, slct) in unselected.enumerate() { // before ... } for (i, slct) in unselected.enumerated() { // after ... }
細かい API の変更は全部これで直してくれるっぽい。
手動で直した箇所
ビルドしてみると以下の2点で警告が出た。
第一引数をラベル無し引数で渡す場合は明示的に指定する必要がある
Swift 3.0 では基本的に引数のラベルは省略しない事になったらしい。
let combos = combination([0, 1, 2], length: 2) // before let combos = combination(arr: [0, 1, 2], length: 2) // after
ライブラリはこれに合わせて全部ラベル付きで呼び出すように修正したけど、ラベルを省略したコードをそのまま動かしたい場合は、関数定義の引数ラベルの前に _
を付ければ一応オッケーらしい。
public func combination<T>(arr:[T], length:Int? = nil) -> [[T]] { // before ... } public func combination<T>(_ arr:[T], length:Int? = nil) -> [[T]] { // after ... }
関数の戻り値を使用しない場合は明示的に指定する必要がある
関数定義の方で戻り値を指定している場合、それを使わないと警告が出る。
_ = myFunc()
のように _
への代入を書くか、関数定義の上に @discardableResult
を付けることで警告を消すことができた。
_combination(arr: arr, length: _len){ ret.append($0) } // 警告が出る _ = _combination(arr: arr, length: _len){ ret.append($0) } // 警告が消える @discardableResult // これがあれば戻り値を破棄出来る internal func _combination<T>(arr:[T], length:Int, process:([T]) -> ()) -> [T] { ... }
とりあえず @discardableResult
を関数定義に付ける方向で対応することにした。
プログラミングにおける略称のベストプラクティス(を誰か教えてください)
XML, DOM, JSON, APIなどの略称を変数の命名等で使う時のフォーマット統一したい(して欲しい)。
XMLHttpRequest
XML
、
Extensible Markup Language(エクステンシブル マークアップ ランゲージ)
ウィキペディア: Extensible Markup Language
Http
、
Hypertext Transfer Protocol(ハイパーテキスト・トランスファー・プロトコル、略称 HTTP)
ウィキペディア: Hypertext Transfer Protocol
Request
。
XML
だけ全部大文字、(略称)(略称)(単語)の組み合わせ。
DOMContentLoaded
そもそもイベントタイプって全部小文字やなかったんかいというツッコミを入れつつ。
DOM
、
Content
、Loaded
。
はいはいなるほど、頭文字の略称だけは全て大文字にするっていうパターンね、だんだん見えてきたよ。
組み合わせは(略称)(単語)(単語)。
jsonFlickerApi
flickrのAPIをJSONPで使うときに呼び出される関数の名前
なんと固定。
任意の名前を指定できない。
これは、メソッド名だから頭文字の略称はすべて小文字にするのか、ふむふむ。
Api
は略称だけど普通にキャメルケース。
toJSON
と思ったらそうでもないんだねえぇ〜、JSON
は全部大文字なんだねえぇ〜。
こんな感じなので自分で命名する時も迷う。
ちゃんとした命名規則欲しい。
snake_case
だといいなと思ったけど、そういう問題じゃないっぽい。
railsにはActionModel::Serializers::Xml
というモジュールと、ActiveSupport::XmlMini_Nokogiri::Nokogiri::XML
というモジュールが存在する(Dashで見ただけですが)。
何か法則があるのかも知れないけど分からない。
個人的に略称は大文字か小文字どちらかに統一したいという欲求はある。 クラス、定数なら大文字、インスタンス、変数やメソッドなら小文字で全部書きたい。
結局どうするのがいいんでしょうね
みたいに書くのが一番規則性が保たれるような気がしている今日このごろ。
LightTableのプラグインを手動でアップデートする方法
LightTableは下記のディレクトリに各プラグインのフォルダが置いてある。(OS Xの場合)*1
~/Library/Application\ Support/LightTable/plugins/
ここにプラグインのリポジトリをクローンして、LightTableを再起動すればアップデートは完了する。
下はRuby Instareplをアップデートする際の例。
$ cd ~/Library/Application\ Support/LightTable/plugins/ $ git clone https://github.com/existentialmutt/lt-ruby.git
ついでにフォルダの名前をlt-ruby
からRuby Instarepl
に変更しておく。
これは、他のプラグインもフォルダの名前がプラグイン名と同じになっていることに習ってそうしているが、必要かどうかは定かで無い。
各プラグインのリポジトリの場所はプラグインマネージャで確認できる。
具体的にはsource
というボタンを押すと、リポジトリのURLをブラウザで開いてくれる。
蛇足っち
最近プラグインの更新が無いなあ、無さ過ぎるなあとは思っていた。
やっぱり更新に失敗していた。
Rubyのプラグインがいまいち調子悪いので重い腰を上げて調べてみた。
(具体的には[]
やArray.new
を使って配列を作ると、エラーになる症状があった)
以下はchangelog
より一部抜粋、
* CHANGED: Remove plugin server and use Github as the plugin-metadata repository (ibdknox)
Remove plugin server
って書いてありますね。
代わりにGithubのplugin-metadataリポジトリを使います、というように解釈した。
プラグインマネージャーを使ってインストールすること自体は出来ていたのでまったく使えなくなった訳じゃ無さそうだし、、、
とにかく、良くわからないけどplugin-metadataリポジトリを見に行ってみた。
リポジトリにはズラっとプラグインの名前のフォルダが並んでいる、どうやらここでプラグインをホストしているっぽい。
Ruby Instareplのフォルダを見てみると、なんと0.0.15
までリリースされている。
自分のLightTableのプラグインの更新は0.0.9
で止まっていたので、明らかに更新の通知がうまく取れていない。
バージョニングの並びを辞書順で、
0.0.1 0.0.10 0.0.11 0.0.12 0.0.13 0.0.14 0.0.15 0.0.2 0.0.3 0.0.4 0.0.5 0.0.6 0.0.7 0.0.8 0.0.9
こう解釈してしまっていると思われる。
そういえば、以前長さが1000
の配列をコンソールに出力した際にも辞書順で整列されていた。
Ruby Instareplのバージョニングの方法が悪いのか、プラグイン管理の仕方にバグがあるのか分からないけど、どうやらこれは手動で入れるしか無さそうだ。
自分の場合、LightTableを再インストールした際、プラグインマネージャの表示するプラグインのバージョンが下がった様な気はしていた。
プラグインマネージャがうまく最新版を取ってこれないので、手動でクローンしてあげたら上手くいった。
まあ根本的な解決にはなってないので、いい方法を知っていたら教えてください、よろしくお願いします。
*1:他の環境は見てないので分からないが、いわゆるユーザーディレクトリ下にあると思われる。