*

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第一回「Swiftの概要」 

公開日: : 最終更新日:2014/11/27 Swift , ,


スポンサードリンク



Swiftの簡単な説明

アップルのiOS(iOS8以降)およびOS Xのためのプログラミング言語。Worldwide Developers Conference (WWDC) 2014で発表された。
アップル製OS上で動作するアプリケーションの開発に従来から用いられていた言語であるObjective-CやC言語と共存することを大きなコンセプト
とはしていますが、無意味に括弧が多く、仕様の追加と互換性の担保のために、言語として分かりにくくなってしまったObjective-Cに
取って代わる言語として期待されています。

Objective-CとSwiftの相互呼び出しのイメージは以下のようになります。
結局、両者を自由に呼び出せるって事が言いたいだけなのですが・・・
スクリーンショット 2014-09-09 10.46.58

では、今後のiOSアプリケーションの開発者はSwiftだけを知っていれば良いかと言うとそうはいきません。
サードパーティの既存のライブラリがSwiftにすぐに完全対応することは不可能でしょうし、
.Net FrameworkのマネージドコードがSwiftで、アンマネージドコードがObjective-Cの関係に相当すると言え、
Swiftは、変なコンパイル処理によって無駄な処理が追加される可能性があるので、えーーい、そう来るならObjective-Cで書きなおしちゃえ
って事が発生する可能性は結構あると個人的には思っています。

まあ、SwiftコンパイラがこなれてくるとほぼSwiftオンリーになる時も来るかもしれません。

Swiftの超早入門

まずは、Swiftの基本的なところの各概要を簡単に説明させていただきます。
詳細な説明は別エントリーを数回に分けて作成する予定です。

利用している環境は「Xcode 6 GM seed」となります。

宣言と基本データ型

変数宣言

var 変数名 = 変数リテラル
もしくは
var 変数名: 変数の型 = 変数リテラル
で行えます。

定数宣言

変数宣言のvarをletに変えるだけで定数宣言を行えます。

基本データ型

Swiftの代表的な基本データ型には、Int(整数型)、Double(浮動小数点数型)、String(文字列型)、
Character(文字型)、Bool(真偽型)があります。

他の一般的な言語と同様にSwiftの変数と定数には、値型(Value Type)と参照型(Reference Type)の2種類があり、
前者は値代入の際には値自体がコピーされるのに対し、後者は値代入の際にはオブジェクトへの参照のポインター(アドレス)がコピーされます。

ここで注目なのがStringが値型であることです。JavaやC#では参照型となっていますので、この点は留意しておく必要があります。

宣言と基本データ型のサンプルコード

・基本となる変数と定数の宣言例
変数のintValue1、intValue2と定数のdoubleValue1、doubleValue2を定義しています。

・定数の値を変更してみる
次にdoubleValue2の値を変更する処理を追加してみます。すると当たり前ですがコンパイルエラーとなりました。
スクリーンショット 2014-09-09 18.48.27
スクリーンショットでは見にくいですがCannot assign to ‘let’ value ‘doubleValue2’とのエラーメッセージとなっています。

・異なる型の変数の代入
Double型とString型の変数を宣言し、異なる型の変数の代入時の動きを確認してみました。

5行目と7行目は予想通りコンパイルエラーとなりました。
9行目はIntにDoubleを代入するのも当然コンパイルエラーとなりました。
問題は11行目です。DoubleにIntを代入する時には暗黙の型変換されるのが普通(少なくともJavaはそう)
なのですが、コンパイルエラーとなります。

これが数値型におけるSwiftの仕様の注意点です。
いかなる数値型の変数についても暗黙の型変換(cast)が行われることはなく、型の違う数値同士の演算では、
右辺と左辺で型の異なる代入は全てコンパイルエラーとなります。

・異なる型のリテラルの代入
変数同士の代入は予想通りでしたが、リテラルの代入はどうでしょうか?

Stringに数値型を代入できないのは理解できますが、エラーメッセージはイマイチですね・・・
数値型への代入に関しては右辺がリテラルだけの場合は暗黙の型変換が行われます。
右辺にも変数が絡んでくる場合は暗黙の型変換は行われないので注意が必要です。
(右辺が四則演算になっている場合)

コレクション型

Array

基本的にObjective-CのNSMutableArrayクラスに相当の型と考えていただいて問題ないですが、
ジェネリクス対応がなされています。Javaのジェネリクス対応のリストと同じですね。

・Arrayの宣言方法
Stringの要素で構成される配列:Arrayの宣言方法は以下のようになります。
var Arrayの変数名 = [“要素の値1”, “要素の値2”, “要素の値3”]
また他の変数と同様に型を明示して宣言することも可能です。以下の例だとStringを要素とするArrayと指定しています。
var Arrayの変数名: Array = [“要素の値1”, “要素の値2”, “要素の値3”, “要素の値4”]

これ以降はXCTestのテストメソッドで各種動きの説明を行います。
・要素取得、参照
Arrayの変数名[i]でi番目の要素が参照可能です。
またArrayの変数名[i…j]でi番目からj番目の要素を持つ部分配列に相当する物が取得可能です。
2014年11月25日修正と言っても実際にはこの時取得できるオブジェクトはSliceという物でArrayではありまん。Arrayとして取得するにはArray(変数名[i…j])と記述する必要があります。

ここまでをテストメソッドで確認してみます。
2014年11月25日修正Swiftの仕様変更によりSliceオブジェクトとArrayを直接比較できなったため、SliceからArrayを作成して比較するように修正

予想通りテストは成功しました。

・要素の追加、更新、削除
この処理のポイントはArrayにArrayを追加できる。Arrayの任意の部分を指定Arrayで更新できることぐらいです。
他の処理は他の言語と同じ考え方でOKです。

Dictionary

基本的にObjective-CのNSMutableDictionaryクラスに相当の型と考えていただいて問題ないですが、
ジェネリクス対応がなされています。Javaのジェネリクス対応のHashMapと同じですね。

・Dictionaryの宣言方法
まずは宣言方法ですが、Arrayと同様にジェネリクスを利用して明示的な型指定をすることもできますし、
右辺の値で暗黙的に解決させることもできます。

・Optional型
Dictionaryの話題とは直接関係ないのですがSwiftにはOptional型という物があります。
Dictionaryのキーに対する値を取得した場合は必ずこのOptional型になります。
理由は不明ですが、キーがDictionaryに存在するかどうかに関わらず同じ処理にして欲しいのでしょうか・・・
結局はnilじゃなかったらって判定がどこかで入るので意味ないような気がしますが・・・

Swiftの変数にはnilを代入することはできません。nilを代入できるようにするためにOptional型を利用します。

Optional型にする場合は、変数宣言時の型の後ろに?を付与します。
またOptionalのT:テンプレートに宣言したい型(IntやString等)を指定した型として宣言することでも可能です。

Optional型の宣言例
normalIntはOptional型ではないのでnilを代入できません(コンパイルエラー)
wrapInt1とwrapInt2はIntのOptional型として宣言していますのでnilを代入できます。

wrapInt1とwrapInt2はOptional型でラップ(wrap)されていると表現します。
逆にOptional型からアンラップ(unwrap)するには!を変数名の後ろに付与します。

6行目の右辺はwrapInt1の後ろに!がついています。!が無ければ型の推定でunwrapInt1はwrapInt1と同じInt?となりますが、
!によってOptional型からアンラップされるのでunwrapInt1はIntと型が決まります。
アンラップする時の注意点はnilでないかのチェックを事前に行うことです。この例のままではランタイムエラーが発生します。

・要素取得、参照
Dictionaryの参照方法はDictionaryの変数名[キー]で行えます。
取得した値はOptional型となりますので非nilチェックは必須です。

・要素の追加、更新、削除
この処理は全てDictionaryの変数名[キー]=
で値を代入することで行えます。
Dictionaryに指定したキーが存在しない場合は新規追加、存在する場合は値の更新、nilを代入すると指定したキーの削除となります。

更新はupdateValueメソッド、削除はremoveValueForKeyでも行えます。

制御構文

if文、for文、switch文、while文等が利用できます。
基本的にはJavaとほぼ同じです。今回は概要ですのでサンプルコードのみとさせていただきます。

注意点としてはswitchの各case文が暗黙的にbreakされることです。
Java、C、C++、C#等は明示的にbreak命令を書かないとそのcase文以下の全てのcase文が実行されます。

メソッド定義

戻り値の有るメソッドの定義方法

戻り値の有るメソッドの定義方法は以下のようになります。
func メソッド名(引数名1: 引数名1の型, 引数名2: 引数名2の型) -> 戻り値の型 {}

またObjective-Cのように外部引数名を指定して呼び出してもらいたい場合は
func メソッド名(外部引数名1 引数名1: 引数名1の型, 外部引数名2 引数名2: 引数名2の型) -> 戻り値の型
のように各引数名の前に半角スペースをはさんで外部引数名を指定します。
(全ての引数に対して外部引数名を指定する必要はございません。)

実装サンプルは以下のようになります。

あれ!?、8行目でコンパイルエラーが発生しています。
エラーメッセージはMissing argument label ‘value2:’ in callとなっています。
value2には外部引数名を指定していないのでvalue2:は書かなくてもOKなはずですが、どこかで仕様変更があったのでしょうか?

testFuncReturnValueSampleを以下のように変更するとコンパイルもテストも成功しました。

戻り値の無いメソッドの定義方法

戻り値の無いメソッドの定義方法は以下のようになります。
func メソッド名(引数名1: 引数名1の型, 引数名2: 引数名2の型) {}

クラス

最後はクラスの定義方法です。

基底クラスを指定しないクラスの定義

クラスの定義方法は以下の通りです。
class クラス名 {
// 実装…
}

基底クラスを指定したクラスの定義

基底クラスを指定した場合のクラスの定義方法は以下の通りです。
class クラス名: 基底クラス {
// 実装…
}

今回は概要説明としていますので、インスタンスメンバを保持したクラスの定義例まで説明させていただきます。

まずは2つの変数と2つの定数を保持したクラスを定義します。

ソース内のコメントにも記載いますが、インスタンス変数、インスタンス定数の宣言時に初期値はセットする必要はないです。
当然セットしてもいいです。
上記のコードのみの場合はコンパイルエラーが発生します。
エラーメッセージはClass ‘SomeClass’ has no initializersとなっています。これはinit()が存在しないとのエラーです。
initializerは全てのクラスに必須な物ではありませんが、SomeClassは初期化されていない変数:value2と定数:value4
が存在しているため、initializerでそれぞれを初期化する必要があります。

空っぽのinit()を追加してみました。

今度は
Property ‘self.value2’ not initializedとのエラーメッセージに変わりました。
value4も同じ扱いだと思うのですが・・・

value2とvalue4の初期化処理を追加したところコンパイルが成功しました。

なお、initializerはJavaのコンストラクタのように引数を指定することも可能です。
以下の例では引数にvalue1とvalue2を指定できるようになっています。
この場合value2は引数にもインスタンス変数にも存在するので、インスタンス変数のvalue2はself.value2と表現する必要があります。

最後にメソッドを追加し、そのメソッドを呼び出す処理を書いてみます。
と言ってもfuncReturnValueSampleメソッドをSomeClassにコピーして
SomeClassをインスタンス化しfuncReturnValueSampleメソッドを呼び出すようにするだけです。

SomeClassは以下のようになりました。

SomeClassをインスタンス化しfuncReturnValueSampleメソッドの呼び出しは以下のようになります。

今回はSwiftの構成要素の必要最低限の説明のみとなっていますので、今後より詳細なエントリーを作成していく予定です。
「Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第一回「Swiftの概要」」は以上です。

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」に続きます。

関連オススメ書籍


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Xcode6の正式版がリリースされApp Storeからダウンロードしインストール可能になりました。

ついにSwiftが利用できるXcode6の正式版がリリースされました。 ブラウザからMac App

記事を読む

2014年の秋のAppleのプレスイベントとXcode6-beta-7のインストール方法

2014年の秋のAppleのプレスイベント いよいよAppleは、米国西海岸時間9月9日午前10時

記事を読む

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジェクトをくらいながら、開発開始

記事を読む

Xcode6(Swift)のデリゲートとプロトコルの使い方

Xcode(Objective-C)のデリゲートの使い方では利用言語がObjective-Cの時のデ

記事を読む

Swift入門[公式リファレンスのチュートリアルのSteps2の前半]

「Swift」と「Xcode 6」を少しずつさわっていこうと思ってはいるのですが、「Xcode 6

記事を読む

Xcode6とSwiftで画面コンポーネント(UIコンポーネント)を配置して利用するための基本

当然ですが、iOS向けのアプリケーションを作成するためには、 画面に画面コンポーネント(UIコンポ

記事を読む

Xcode6_Beta5&SwiftでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法

前回は、「Xcode5&Objective-CでUITableViewでUINibを使ったカ

記事を読む

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回は同じ著者(大重美幸様)の本を

記事を読む

Swift(Xcode6-Beta2)でStringのメソッド(stringByReplacingCharactersInRange:withString:)のコンパイルが通らない時の対処

SwiftでStringのメソッド stringByReplacingCharactersInRa

記事を読む

Xcode6(xcode_6_beta_7、Xcode 6 GM seed)のインストール方法

2014年9月22日追記 Xcode6の正式版がリリースされApp Storeからインストール可能

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑