https://developer.apple.com/swift/ より
The Swift Programming Language (iBooks Store)をざっくり目を通してつらつらと。
プロパティの監視 (willSet
と didSet
)
Objective-C でいうところの KVO (Key-Value-Observing) のような位置づけになるんでしょうか、プロパティに対して、willSet
と didSet
というオブザーバーを設定することができます。
struct SomeClass {
var value: Int {
willSet {
// value がセットする前に呼ばれる
}
didSet {
// value がセットされた直後に呼ばれる
}
}
}
メソッド
インスタンスメソッド
基本形:
class SomeClass {
func doSomething() {
// なんかする
}
}
class
や struct
の中で宣言された func
。呼び出しはインスタンスに .
を付けて。
インスタンスメソッドの中で self
はインスタンス自身を指します。Objective-C の self
、JavaScript での this
と一緒。
class SomeClass {
var value = 0
func doSomething() {
self.value // value プロパティにアクセス
// なんかする
}
}
この例だと self.value
としていますが、self
を省略して value
とだけ書いても (ローカルに同一な変数名などがなければ) 同じ意味になります。
ただ、コードの読みやすさを考えると、インスタンスのプロパティやメソッドにアクセスする場合には都度 self
を付けたほうがよいと思います。
値渡し型のインスタンスに対する mutating
メソッド
struct
や enum
などは値渡し型のオブジェクトで、通常インスタンスメソッドでインスタンスのプロパティを変更することはできません。
メソッド内でインスタンスプロパティを変更する際には、そのメソッドを mutating
として宣言する必要があります。
struct SomeStructure {
var value = 0
mutating func doSomething() {
self.value = .... // value プロパティを変えるので、mutating が必要
}
}
タイプメソッド - クラスメソッド / 静的メソッド
プロパティにタイププロパティがあるようにメソッドにもタイプメソッドがあります。
class SomeClass {
class func doSomething() {
// なんかする
}
}
struct SomeStructure {
static func doSomething() {
// なんかする
}
}
添字アクセス (Subscripts)
サブスクリプト (subscript) は配列などであるような some[0]
という []
の添字でアクセスできるようにした仕組みです。これによってあたかも配列やディクショナリのように動作するオブジェクトを作ることができます。
class ArrayishClass {
subscript(index: Int) {
get {
// arrayish[i] で呼ばれる
return ....
}
set(newValue) {
// arrayish[i] = newValue で呼ばれる
}
}
}
get
と set
を省略して read-only にできるのはプロパティの作法と一緒。
class ArrayishClass {
subscript(index: Int) {
// arrayish[i] で呼ばれる
}
}