Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
72
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

Swiftに関するメモ その3 - プロパティの監視・メソッドなど

https://developer.apple.com/swift/ より

The Swift Programming Language (iBooks Store)をざっくり目を通してつらつらと。

プロパティの監視 (willSetdidSet)

Objective-C でいうところの KVO (Key-Value-Observing) のような位置づけになるんでしょうか、プロパティに対して、willSetdidSet というオブザーバーを設定することができます。

struct SomeClass {
  var value: Int {
  willSet {
    // value がセットする前に呼ばれる
  }
  didSet {
    // value がセットされた直後に呼ばれる
  }
  }
}

メソッド

インスタンスメソッド

基本形:

class SomeClass {
  func doSomething() {
    // なんかする
  }
}

classstruct の中で宣言された func。呼び出しはインスタンスに . を付けて。

インスタンスメソッドの中で self はインスタンス自身を指します。Objective-C の self、JavaScript での this と一緒。

class SomeClass {
  var value = 0
  func doSomething() {
    self.value // value プロパティにアクセス
    // なんかする
  }
}

この例だと self.value としていますが、self を省略して value とだけ書いても (ローカルに同一な変数名などがなければ) 同じ意味になります。

ただ、コードの読みやすさを考えると、インスタンスのプロパティやメソッドにアクセスする場合には都度 self を付けたほうがよいと思います。

値渡し型のインスタンスに対する mutating メソッド

structenum などは値渡し型のオブジェクトで、通常インスタンスメソッドでインスタンスのプロパティを変更することはできません。

メソッド内でインスタンスプロパティを変更する際には、そのメソッドを 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 で呼ばれる
    }
  }
}

getset を省略して read-only にできるのはプロパティの作法と一緒。

class ArrayishClass {
  subscript(index: Int) {
    // arrayish[i] で呼ばれる
  }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
72
Help us understand the problem. What are the problem?