Swift Language
スタイルコンベンション
サーチ…
備考
SwiftにはSwift.orgのAPIデザインガイドラインがあります。もう一つの人気のあるガイドはThe Official raywenderlich.com Swift Style Guideです。
明確な使用法
あいまいさを避ける
クラス、構造体、関数、変数の名前はあいまいさを避けるべきです。例:
extension List {
public mutating func remove(at position: Index) -> Element {
// implementation
}
}
この関数への関数呼び出しは、次のようになります。
list.remove(at: 42)
このように、あいまいさは避けられます。関数呼び出しが単にlist.remove(42)
になる場合、42に等しい要素が削除されるか、またはIndex 42の要素が削除されるかどうかは不明です。
冗長性を避ける
関数の名前には重複した情報が含まれてはいけません。悪い例があります:
extension List {
public mutating func removeElement(element: Element) -> Element? {
// implementation
}
}
関数の呼び出しは、 list.removeElement(someObject)
ようにlist.removeElement(someObject)
ます。変数someObject
すでに要素が削除されていることを示します。関数のシグネチャは次のようになります。
extension List {
public mutating func remove(_ member: Element) -> Element? {
// implementation
}
}
この関数の呼び出しは、 list.remove(someObject)
ます。
役割に応じた変数の命名
変数は、そのタイプ(例えば、工場、文字列など)ではなく、役割(例:サプライヤ、挨拶)によって命名されるべきです。プロトコル名と変数名の高い結合
型の名前がほとんどの場合その役割を記述している場合(例:Iterator)、型の名前に接尾辞 `Type`を付ける必要があります。 (例:IteratorType)弱く型付けされたパラメータを使用する場合の追加の詳細を提供する
オブジェクトの型が関数呼び出しでその使用法をはっきりと示さない場合、その弱い型付けされたパラメータの先行する名詞を使用して関数の名前を付ける必要があります。例:
func addObserver(_ observer: NSObject, forKeyPath path: String)
それは呼び出しが `object.addObserver(self、forKeyPath:path)のようになります。
の代わりに
func add(_ observer: NSObject, for keyPath: String)
呼び出し先はobject.add(self, for: path)
ようになります。
流暢な使い方
自然言語を使用する
関数呼び出しは、自然な英語に近いものでなければなりません。例:
list.insert(element, at: index)
の代わりに
list.insert(element, position: index)
ネーミングファクトリメソッド
ファクトリメソッドは接頭辞 `make`で始まります。例:
factory.makeObject()
初期化子とファクトリメソッドの名前付けパラメータ
最初の引数の名前は、ファクトリメソッドまたはイニシャライザの命名に関与してはなりません。例:
factory.makeObject(key: value)
の代わりに:
factory.makeObject(havingProperty: value)
副作用による命名
- 副作用のある関数(変数関数)には、接頭辞
form-
付いた動詞または名詞を使用して名前を付ける必要があります。 - 副作用のない関数(非突然変異関数)には、接尾辞
-ing
または-ed
名詞または動詞を使用して名前を付ける必要があります。
print(value)
array.sort() // in place sorting
list.add(value) // mutates list
set.formUnion(anotherSet) // set is now the union of set and anotherSet
非突然変異関数:
let sortedArray = array.sorted() // out of place sorting
let union = set.union(anotherSet) // union is now the union of set and another set
ブール関数または変数
ブール値を含むステートメントは、アサーションとして読み取る必要があります。例:
set.isEmpty
line.intersects(anotherLine)
命名プロトコル
- 何かを記述するプロトコルは、名詞を使用して命名する必要があります。
- 能力を記述するプロトコルは、接尾辞として
-able
、-ible
または-ing
を持つ必要があります。
Collection // describes that something is a collection
ProgressReporting // describes that something has the capability of reporting progress
Equatable // describes that something has the capability of being equal to something
タイプとプロパティ
型、変数、プロパティは名詞として読み込む必要があります。例:
let factory = ...
let list = [1, 2, 3, 4]
大文字
タイプとプロトコル
タイプとプロトコル名は大文字で始まる必要があります。
例:
protocol Collection {}
struct String {}
class UIView {}
struct Int {}
enum Color {}
ほかのすべて...
変数、定数、関数、列挙ケースは、小文字で始まる必要があります。
例:
let greeting = "Hello"
let height = 42.0
enum Color {
case red
case green
case blue
}
func print(_ string: String) {
...
}
キャメルケース:
すべての命名は、適切なラクダのケースを使用する必要があります。タイプ/プロトコル名のための上のラクダケースと他のすべてのもののためのより低いラクダケース。
アッパーキャメルケース:
protocol IteratorType { ... }
下のキャメルケース:
let inputView = ...
略語
略語(例:URL、ID)を使用しない限り、略語は避けるべきです。省略形を使用する場合は、すべての文字に同じ大文字と小文字を使用する必要があります。
例:
let userID: UserID = ...
let urlString: URLString = ...