【iOS, swift】swiftコーディング規約
※ Swift 2.3をベースに記載
自分がswiftを書くときのコーディング規約を記載します。
クラス
- Pascal記法 (大文字で始まる) で記述する
// ◯ class ViewController: UIViewController { } // ☓ snake case class view_controller: UIViewController { ・・・ }
継承
する時にクラス名の後ろにつける:
は:の後ろにスペースを入れる
// ◯ class ViewController: UIViewController { } // ☓ class view_controller:UIViewController { }
メソッド
- Camel記法(小文字始まり)で記述する(
hogeFuga
) - メソッド名は動詞を使う
;
は付けない{
の行は改行しない。前にスペースを入れる。->
の前後はスペースを入れる
// ◯ func getName() -> Strig { return "name" } // ☓ name snake func getName() -> Strig { return "name" } // ☓ break func getName() -> Strig { return "name" } // ☓ space func getName()->Strig { return "name" }
変数・プロパティ(保持型・計算型)
- Camel記法(小文字始まり)で記述する(
hogeFuga
) - 行末に
;
は付けない - privateな保持型プロパティは
_
から始める(_hogeFuga
) - interlな保持型プロパティは
internal
を省略する- 理由: 基本的にスコープは厳格にすべきである。
- しかし
private
スコープはテストファイルから参照できない。 - テストを書くことの方が重要のため基本的に
internal
であることを許可する。 internal
がデフォルトであるため、冗長を削除するため省略して良しとする。
- 基本的に
public
は使用しない- 理由: 同じモジュール内であれば参照可能なためPublicは必要ない
- ※ APIを定義する場合は必要
計算型プロパティ
のgetがある場合はprivate
でOK
class Sample { // ◯ var userName: Int; private var _userMessage: String; func hoge() -> Int { let age = 10 return age } private var _inSpeed: Double = 0 var speed: Double { get { return self._inSpeed + 10; } set(speed) { self._inSpeed = speed } } // ☓ Pascal var UserName: String; // ☓ not `_` private var userLevel: Int; }
- storybord(or xib)上で強参照する変数(ViewController.viewが保持するなど)は
@IBOutlet weak var
で宣言する
// ◯ @IBOutlet weak var clickHogeButton: UIBarButtonItem! // ☓ @IBOutlet var clickHogeButton: UIBarButtonItem!
- 読み取り専用のプロパティと添字付けのgetterは暗黙的にする
- 可能な限り、読み取り専用のプロパティと添字付けでは
get
キーワードを省略する - 理由: 意図と意味が明確だから。コードも少なくて済む。
// ◯ var myGreatProperty: Int { return 4 } subscript(index: Int) -> T { return objects[index] } // ☓ var myGreatProperty: Int { get { return 4 } } subscript(index: Int) -> T { get { return objects[index] } }
enum
// ◯ enum CustomResult { case Success, case Error } // ☓ upper case enum CustomResult { case SUCCESS, ERROR } // ☓ Case is not omitted enum CustomResult { case Success, Error }
if
- 判定式に
()
は付けない {
の前には改行は入れない
// ◯ let x = 1 if x == 1 { print("") } // ☓ let x = 1 if (x == 1) { print("") }
for
for-in
を使用する{
の前には改行は入れない- cの構文
for(let i; i < 10; i++)
は使わない(非推奨になっている)
// ◯ var sum: Int = 0 for i in 1...10 { sum += i } // ☓ var sum: Int = 0 for (var i = 1; i <= 10; i += 1) { sum += i }
switch
{
の前には改行は入れないswitch
とcase
の左は揃える
// ◯ let c: Int = 1 switch c { case 1: print("") } // ☓ let c: Int = 1 switch c { case 1: print("") }
可能な限りvar
宣言よりもlet
宣言を使う
- 理由:
let
は値が変わらないことを保証するためより安全で明確なコードになる
1行の文字数
- 努力目標:80文字
- 最大:100文字
識別子に型を指定する時は、常に識別子のすぐ後ろにコロンを置き、空白を一つあけて型名を書く
// ◯ class MyClass: SuperClass { ... } let myConst: Int = 2 func myFunc(type: Int) -> String { ... } // ☓ class MyClass:SuperClass { ... } let myConst:Int = 2 func myFunc(type:Int) -> String { ... }
明示的なself
参照は必要な時だけ
self
の持つプロパティやメソッドへアクセスする時、デフォルトではself
への参照は省く- 理由: クロージャにおける
self
のキャプチャリングが目立つようになる。その他の場所における冗長さが無くなるため。
class MyClass { var hoge: Int // ◯ func myFunc() { hoge = 1234 } var myClosure: () -> () { return { self.hoge } } // ☓ func myFunc() { self.hoge = 1234 } }