最近は Swift を再勉強中! 一度アプリをがっつり作ったことがあって、それでもう一度Swiftを学んでいる。 そうすると開発中にモヤモヤしていたところが解決される時があって、いい感じ。
今回はコーディング規約について調べてみたのでメモ。
Github をはじめとしたSwift経験者が Swift のコーディング規約をまとめていて、それの日本語版もコミュニティーで翻訳されていたりする。
swift-style-guide/README_JP.md at master · jarinosuke/swift-style-guide · GitHub
raywenderlich/swift-style-guide · GitHub
特に参考になったところをピックアップ。
オプショナル型
これを真っ先に持ってくるあたり、好感が持てる。Swiftを書くと、ほとんどのコンパイルエラーはこのオプショナル型の対応になってくる。慣れないうちはxCodeのコンパイルエラーを取るのに一苦労だ。そして手軽に!(暗黙的開示オプショナル型)を使ってアンラップすると実行時エラーになったりする。
極力letを使うようにして、ifによるアンラップをするよう推奨されている。
if let foo = foo { // 開示された`foo`の値を使う } else { // 必要な場合はここでオプショナルがnilの場合の処理を行う }
複数オプショナルの if アンラップの場合
var subview: UIView? var volume: Double? // later on... if let subview = subview, volume = volume { // do something with unwrapped subview and volume }
できる限り struct を使う
Java で書くのに慣れていると、クラス命!って感じなんだけど、Swiftだとクラスはちょいと扱いにくい。 Swift の struct はなぜかクラスでできるようなことをたくさん提供してくれてて、さらにクラスよりシンプルに書けるというのでクラスとの細かい違いはあれど、structを優先的に使うようにしよう。protocolの実装もstructでできちゃうのか!
protocol Vehicle { var numberOfWheels: Int { get } } func maximumTotalTirePressure(vehicle: Vehicle, pressurePerWheel: Float) -> Float { return pressurePerWheel * vehicle.numberOfWheels } struct Bicycle: Vehicle { let numberOfWheels = 2 } struct Car: Vehicle { let numberOfWheels = 4 }
エクステンションを利用して、プロトコルの実装を元クラスと分ける
テーブルのデリゲートのViewControllerを作成していると、どうもファットなViewControllerになりやすい。エクステンションを利用してそれらを可能な限り分けてみよう。エクステンションでクラスを分けたとしても、同じクラス内の関数を呼び出すことができる。
class MyViewcontroller: UIViewController { // class stuff here } // MARK: - UITableViewDataSource extension MyViewcontroller: UITableViewDataSource { // table view data source methods } // MARK: - UIScrollViewDelegate extension MyViewcontroller: UIScrollViewDelegate { // scroll view delegate methods }
昔ながらのforは書かない
for _ in 0..<3 { println("Hello three times") } for (index, person) in enumerate(attendeeList) { println("\(person) is at position #\(index)") }
次回は
matteocrippa/awesome-swift · GitHub をそれぞれ調べてみよう。