swift触ってると、謎のキーワードによく遭遇する(まぁ、勉強不足なだけだけど…)
とりあえず、書いて記憶するためと、忘れた時のために、今日調べた謎キーワードを残しておく。
共通で使用するコード
protocol Container {
associatedtype Item
mutating func append(_ item: Item)
var count: Int { get }
subscript(i: Int) -> Item { get }
}
struct IntStack: Container {
// original IntStack implementation
var items = [Int]()
mutating func push(_ item: Int) {
items.append(item)
}
mutating func pop() -> Int {
return items.removeLast()
}
// conformance to the Container protocol
typealias Item = Int
mutating func append(_ item: Int) {
self.push(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> Int {
return items[i]
}
}
associatedtype
The Swift Programming Language (Swift 4): Generics
protocolを定義する時に、まだ型が決まってないものに対して使うらしい。
そしてprotocolを実装する側で、型を決める。
typealias Item = Int
この部分がprotocol定義時に曖昧だったItemをIntにしますという宣言らしい。
ただ、ドキュメントによるとswiftの型推論は素晴らしいので、typealiasは書かなくても良いとの事。
mutating
最初Qiitaの以下の記事をみた時に
The Swift Programming Language – Method(メソッド)をまとめる
mutating を func の前に設定するとメソッド経由でプロパティをメソッドの実行終了とともに更新できる
って書いてあって、「え?メソッド経由でプロパティを変更出来るのって当り前じゃないの?え??」って感じになった。
The Swift Programming Language (Swift 4): Methods
んで、Appleのドキュメントを見ると
Structures and enumerations are value types. By default, the properties of a value type cannot be modified from within its instance methods.
とあって納得。
なるほど、構造体と列挙体の場合のみ適用される話なのね。
ぶっちゃけ、構造体とか列挙体を使いこなしておらず、大体いつも作る時はクラスのみだったのでお目にかからなかった訳だ。
今後、構造体とクラスを使い分けする日が来たら、お世話になるのかもしれん。
subscript
The Swift Programming Language (Swift 4): Subscripts
Classes, structures, and enumerations can define subscripts, which are shortcuts for accessing the member elements of a collection, list, or sequence. You use subscripts to set and retrieve values by index without needing separate methods for setting and retrieval.
う〜ん…上手く使えばプロパティのsetterとgetterを分けて書かなくても良くなるって事らしいけど、今のところ使う予定が最も低そうな気もする。
これもswiftを使いこなすようになったら必要になるのかもしれん。
まとめ
swiftは何か謎キーワードが多い気もするけど、自分が使わなくてもサンプルコードを読む時に分かってないと読めなかったりするので、今後も分からないキーワードが出てきたら、こうやってまとめていこうと思う。
コメント