*

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

公開日: : 最終更新日:2014/10/13 Swift


スポンサードリンク



「Swift入門[公式リファレンスのチュートリアルのSteps2の前半]」では、Steps2の前半まで説明させていただきました。

本エントリーでは、

Swiftの公式リファレンスのチュートリアル
のSteps2の残りの部分を説明させていただきます。

今回も、「The Swift Programming Language」の「Swift Programming Series 第1巻」 を見ながら進めてこうと考えております。

エラー発生時のPlaygroundの動作

エラーが発生した時のPlaygroundの動作についての記載が「As you change your code,」以降にあります。

コンパイルエラーがある時のと書きたいのですが、
「Playgroundでは、Swiftはコンパイルしなくても実行できる。」というニュアンスの記述があるので
その表現は不適切ですね、でも結局は、一般的なonChangeイベントを拾ってコンパイルして、実行結果をsidebar(Playgroundの右のグレーの領域)に表示しているだけのような気が・・・

前置きはこれぐらいにして、現在のソースの最後の行に
let j = 3
を追加してみました。既に変数jが宣言済みですので、どう考えてもjという名前の定数は宣言できないはずです。

すると、追加したコードの行に変化が現れました。

  • コードの行番号の左端に赤丸のビックリマークが表示される。
  • 「Invalid redeclaration of ‘j’」とエディタの最後、サイドバーの左側に表示される。

Xcode displays an error symbol in the gutter. Click the symbol to see an explanation of the mistake.

にあるとおり、gutterにある「error symbol」をクリックすることで、エラー内容の文字列の表示・非表示を変更できます。変更できる?・・・

To examine the value for…以降のコードの説明

とりあえず、「なんじゃこりゃあ!」とジーパン刑事の台詞をつぶやきながら入力してみました。
「Exploring and Evaluating Swift Code in a Playground」のサンプルと全く同じですが、
入力したコードは以下の通りです。

サイドバーの結果もサンプルの結果と同じとなりました。

コードの1行目

定数配列のsizeを定義、値は0番目が20、1番目が40です。
サイドバーの.0 20の表現が0番目が20を意味しています。

配列定数よりもtuple(タプル)の方が表現として正しいかもしれません・・・

コードの2行目

sizeに対するスイッチ文を開始しています。「Swift」のswitch文の高い自由度を現す例ですね。

コードの3行目

条件付きのtuple(タブル)を宣言して、case文の指定値としています。
case文の指定値で定数を宣言する言語は今まで見たことないです。
この書き方はC#のLINQの思想に似ている気がします。

let (width, height) where width == height
は”a tuple of type (Int, Int)”
で実際のラベルは0番目がwidth、1番目がheightであり、かつwidth == heightの条件を満たすものとの意味になりますが、
いまスイッチ文の対象となっているtuple(タブル)は (20, 40)ですので、ヒットする値ではありません。

このあたりの説明は「Swift Programming Series 第1巻」の191ページにあります。
whereで条件を限定しないtuple(タブル)をcase文の指定値とすることも可能なようです。
これは後ほど説明いたします。

コードの4行目

他の言語でもよくあるprintlnです。\(変数名)や\(定数名)を文字列内に埋め込むと、置換して表示してくれます。
Objective-Cでは必要だったダブルコーテーションの前の@は必要なくなっています。

なお、printlnの出力結果はサイドバーには表示されません。製品版では表示されるようになるんですよね・・・
じゃないと、実際の処理に必要ないのに、コード上に変数を並べないといけないです。

あと、説明は不要と思いますが、3行目の条件に一致しないので4行目は実行されません。

コードの5行目

次のcase文は、case (1..10, 1..10)です。
これは「..」の文法に慣れている方には分かりやすいですね。

「Swift入門[公式リファレンスのチュートリアルのSteps2の前半]」でも説明させていただきました。

1..10は1から10より小さい値の配列を意味します。
1…10は1から10以下の値の配列を意味します。

この説明も「Swift Programming Series 第1巻」の15ページに記載があります。

case (1..10, 1..10)ですので、素直に考えると、(1, 1)、(9, 9)、(2, 9)等の値に該当すると思われます。
これも後ほど検証してみますが、(20, 40)はあてはまらないです。

コードの7行目

最後のcase文のcase let (width, height)です。
これは全ての「a tuple of type (Int, Int)」にあてはまります。

コードの8行目

printlnですね、\(width)と\(height)が埋め込まれているぐらいしか見るべきところはないです。

コードの9,10行目

width
height
と記載すことでサイドバーにwidthとheightの値を出力させています。

気になる点の検証

元のコードの一行目をlet size = (20, 20)に変更してみる

変更後のサイドバーにprintln(“square with sides \(width)”)の出力結果が表示されると思ったのですが、
何故か出ない!?

\(width)が悪さをしているのかと思い、\(width)を除去してみるも結果は同じ・・・

初心(ってまだ初心でえすがww)に戻って、1行目に
println(“Hello, world”)
を追加するも表示されない。

Playgroundの作成を「Get started with playground」で行ったから?

まあ、こんなこともよくあるさ!
printlnの変わりにwidthと記述して回避します。width=20がサイドバーに表示されれば、1つ目のcase文に合致しているsizeであると言えます。

コードは以下のようになりました。

サイドバーには以下のように表示されました。

なんと、9、10行目のwidthとheightが表示されなくなりました。
Swiftのswitchのcase文は勝手にbreakするんでしょうか?、はいそうなんです。
明示的にbreakしたくなければfallthrough命令を記述します。

fallthroughを追加したコードは以下の通りです。

しかしこれでもcase let (width, height):内部に進んでくれません。
1回「fallthrough」を書いたら、他のcase文のbodyにも「fallthrough」が必要なのでしょうか?

サイドバーに表示される内容も変更して、コードを以下のように書き換えました。

すると不思議なことに9行目のfallthroughでエラーが発生しました。表示されるメッセージは
‘fallthrough’ cannot transfer control to a case label that declares variables

case (1..10, 1..10):って内部処理としては変数宣言しているんでしょうか?
それならばcase let (width, height) where width == heightの方もエラーとなるはずでは??

これならどうだ!!

これだとcase (1..10, 1..10):もlet (width, height) where width == height:もエラーとなります。
理解不能ですが、複雑なcase labelにの時はfallthroughは呼び出せないようです。

元のコードの一行目をlet size = (9, 3)に変更してみる

元に戻って、case (1..10, 1..10):の検証を行うためにsize = (9, 3)としました。

サイドバーの7行目に”(1..10, 1..10):”と表示されましたので予想通りです。

fallthroughの検証

fallthroughがスッキリしていませんので、単純なswitch文の例で動作を確認してみます。

検証用のコードは以下の通りです。

サイドバーに表示された内容は以下の通りです。
default以外のcase labelのbodyにfallthroughを記載したので予想通りの動作です。
他の言語の各case文でbreakを書かない時と同じ動きになります。

Swiftの概要を説明したエントリーを作成いたしましたので
こちらも是非ご覧ください。
Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第一回「Swiftの概要」


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

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

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

記事を読む

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

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

記事を読む

Xcode6-Beta2でSwiftのユニットテスト(Unit Test)をXCTestフレームワークで試してみる。

タイトルの通りですが、Xcode6-Beta2でSwiftのユニットテスト(XCTestフレームワー

記事を読む

iOS(Xcode6とSwift)におけるマルチスレッド処理の実装方法その1[NSThreadクラスの簡単な利用例]

前回はObjective-CにおけるNSThreadクラスの簡単な利用例を取り扱いましたが今回は、ほ

記事を読む

Xcode6-Beta3でSwiftでBDDを行うためにQuickを導入し動作させる手順

Clone the repository Create a using Quick Pro

記事を読む

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

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

記事を読む

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

Swiftの簡単な説明 アップルのiOS(iOS8以降)およびOS Xのためのプログラミング言語。

記事を読む

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

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

記事を読む

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

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

記事を読む

iOS(Xcode6とSwift)におけるマルチスレッド(非同期)処理の実装方法その2[GCD(Grand Central Dispatch)の利用]

「iOS(Xcode6とSwift)におけるマルチスレッド処理の実装方法その1」ではNSThread

記事を読む

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 ↑