この記事では「The Swift Programming Language」を1から読んだ感想とか発見を書いてみようと思います。
「The Swift Programming Language」とはSwiftの公式ドキュメントでiBooksや下ページで見る事ができます。
The Swift Programming Language (Swift 2.1): About Swift
読んだ所
今回はMethods
という項目を読みました。
The Swift Programming Language (Swift 2.1): Methods
学んだこと
mutating修飾子
Structのメソッドでプロパティーの値を変更する場合はmutating
が必要です。
クラスではmutating
なしでプロパティーの値を変更できます。
struct MyStruct { var prop = 0 mutating func change() { prop += 1 } } var myStruct = MyStruct() myStruct.change()
mutating
がついていてもletで宣言した場合はエラーになります。
let myStruct = MyStruct() // → これはエラーになる myStruct.change()
selfの書き換え
structとenumではメソッド中でselfを書き換える事もできます。
struct MyStruct { var prop = 0 mutating func change() { prop += 1 self = MyStruct(prop: 10) } } var myStruct = MyStruct() myStruct.change() print(myStruct.prop)
selfの書き換えはenumと相性が良さそうです。
enum TriStateSwitch { case Off, Low, High mutating func next() { switch self { case Off: self = Low case Low: self = High case High: self = Off } } }
クラスメソッドの書き方
クラスメソッドを定義する為の修飾子はstaticとclassの2種類があります。
違いですが、staticがサブクラスでのオーバーライド不可、classだとオーバーライドができます。
class A { static func aaa() { print(1) } class func bbb() { print(1) } } class B: A { override static func aaa() { // → エラーになる print(1) } override class func bbb() { print(1) } }
staticとclassはお互いに呼べ合えるようです。
class A { static let a = 1 class var b: String { return "" } static func aaa() { print(a) print(b) } class func bbb() { print(a) print(b) aaa() } }