Swift移行時に引っかかりそうなことを解決する!

第4回 iOSアプリ開発におけるSwiftでの実装の実例とTips

この記事を読むのに必要な時間:およそ 4.5 分

先日,Apple 公式のSwift Blogで,Swift 1.2のリリースがアナウンスされていました。コンパイラの性能改善と,新しい仕様の追加があるようです(まだ試してません……)⁠プログラミング言語がこのようなスピードで進化していくのも,技術の進化のスピードが速いこの時代ならではなのかなと思います。

さて今回は,実際のiOSアプリ開発を例に,Swiftでどのように実装していくか,また引っかかりそうなポイントを解説していきます。また,まだ説明できていないSwift言語仕様も併せて解説したいと思います。

なお,Using Swift with Cocoa and Objective-Cと言うiBookコンテンツが無料で提供されていますWeb版はこちら)⁠タイトルのとおり,SwiftでのiOS/OS X開発に関する具体的な事例が書かれています。英語ではありますが,こちらも併せてご覧ください。

クラスの基礎

さっそく実践編へ,と行きたいところですが,第2回で説明できていなかったクラスについて簡単に説明したいと思います。AppDelegateを参考に,基本的なクラスの構成要素を見ていきます。

// AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    return true
  }
  ...
}

クラス定義

クラスの定義は,classに続けて「クラス名: 親クラス名」のように記述します。デリゲートやデータソースなどのプロトコルは,Objective-Cの場合は,⁠<>」でくくって記述していましたが,Swiftの場合はそのままカンマ区切りで続けて行きます(上記例でのUIApplicationDelegate)⁠

このクラスブロックの中に,プロパティやメソッドを記述していきます。

プロパティ(メンバ変数)

プロパティの定義は,第2回で説明した変数定義のルールと同じです。上記の例では,UIWindow型のwindowというプロパティが定義されていますが,⁠?」が付いているので,オプショナル型となりnilを許容する変数となります。オプショナル型については第2回をご参照ください。

メソッド

メソッドは,funcに続けてメソッド名と引数を定義する括弧が続きます。返り値がある場合にはその後ろに「-> Type」という書式で戻り値の方を指定します。上記例では,Bool型の値を返す事になります。

引数は括弧内にカンマ区切りで定義します。上記の例ですと,第1引数は変数名がapplicationで,その型がコロンの後に続くUIApplicationとなります。

第2引数を見ると,ちょっと長めのラベルdidFinishLaunchingWithOptionsに続いて,launchOptionsと言うラベルがあります。前者は外向きの名前で,Objective-Cと同じく引数に名前をつけることができます。後者は内部で使用する変数名となります。外向きの名前を省略した場合には,変数名がそのまま名前となります。詳しくは,メソッド呼び出しの解説の中で説明します。

そのあとのコロンに続く第2引数の型は,上記の例の場合はDictionaryもしくはnilを渡されることを示します(⁠?」が付いているのでオプショナル型となります)⁠

イニシャライザとデイニシャライザ

initという名前のメソッドはイニシャライザと呼ばれ,インスタンスする時に呼び出されます(C++やJavaでいうところのコンストラクタ)⁠funcキーワードは不要です。引数の名前を変えることで,複数定義(オーバーロード)することができます。これについては「オブジェクトの初期化」の解説の中でも説明します。

また,deinitという名前のメソッドはデイニシャライザ(デストラクタ)で,オブジェクトが破棄されるタイミングで呼び出されます。引数の括弧は不要です。

下記は,initとdeinitの例です。

class Person {
  
  var name = ""
  var age : UInt = 0
  
  init() {
  }
  
  init(name: String) {
    self.name = name
  }
  
  init(name: String, age: UInt) {
    self.name = name
    self.age = age
  }
  
  deinit {
    println("deinit")
  }
}

著者プロフィール

ogaoga

電機メーカーでソフトウェアエンジニア,UIデザイナーとして様々なプロダクトの開発に従事。現在は,IT企業でフロントエンドエンジニアとして,社内の開発環境の整備や標準化などを推進している。趣味でiOSアプリやWebアプリを開発。

コメント

コメントの記入