読者です 読者をやめる 読者になる 読者になる

Swift : 2nd week

Swift勉強会

Swiftビギナーズ勉強会に参加してきました。

Swiftビギナーズ勉強会 第16回 #swiftbg - Swiftビギナーズ倶楽部 #swiftbg | Doorkeeper

幅広い年齢層の方々が参加されていて、個人アプリを作りたい方も大勢おられました。志が同じ人たちが集まって勉強するのって素敵だなと感じました。
初めて勉強会に参加だったため少し緊張していましたが、同じテーブルの方々とたくさん話すことができ、綺麗なコードの書き方を教えていただいたり、Xcodeの便利機能を教えていただいたりできたので、とても楽しかったです。
Swift勉強を始めたばかりなので、知らないことをたくさん知ることができて収穫だらけの1日でした。

タイムスケジュール
14:00~ 勉強会の説明
14:10~ ブレイクタイム
14:20~ ショートセッション
「SwiftでのError Handlingを学び直す!」
「Swiftで遊ぼう!Swift Playgrounds & Play grounds for Xcode7.3.1」
「花火かんたん撮影アプリ “Air Hanabi”の技術紹介」
「セキュアプログラミング初心者向け」
16:00~ もくもく会
17:30~ 成果発表
18:00 終了
Error Handlingの書き方 メモ
  1. Error Typeプロトコルに準拠した列挙型(enum)でエラーを定義する
    (Swift3.0ではError Protocol)
  2. throwsをつける(関数名 メソッド名の()の後に付ける)ことでエラーを投げる可能性があることを宣言。必ずエラーを投げる必要があるわけではない
  3. throwで定義したエラー投げる
    エラーが投げられなかった時だけ最後の処理が行われる
  4. do-catch構文(try catchみたいな)
    doブロックでエラーが起きそうな処理を書く
    catchでそれぞれのエラー内容を処理する
Xcode7.3のPlay groundsのメモ
  • Playground上のUIパーツにタッチして操作できるように → XCPlaygrounds
  • 話を戻してXCPlaygroundsはXCPlaygroundフレームワークをインポートすることで使える。

(Playground自体使ったことがなかったのですこ〜しだけ使ってみました)
File > New > Playground
Playgroundを作成すると、このように表示されます。 左側(背景が白)で編集して、右側(背景が灰色)に結果が即座に表示されます。
f:id:marikooota:20160815152116p:plain

例えば現在の時間を表示させる機能を実装に加えようと思った時に、このような構文で確認することができます。

let now = NSDate()

実際にどういう風に画面に表示されるかは実行してみないとわからないですが、Playgroundを使うとこのように結果が即座に表示されるので、どのような形で表示されるのかを確認することができるのです。

f:id:marikooota:20160815152012p:plain

Swift Playgrounds (iPad) メモ
  • プログラミング学習のためのアプリケーション
  • Swiftのコードを手軽に書いて遊べる
  • iPadで利用可能
  • 現在はiOS10 Betaで利用可能

www.apple.comiOS 10を搭載したiPad Air®、iPad Pro™、iPad mini™ 2以降の全モデルに対応

iPad mini2を持っていたので実際にやってみました。

  1. iOS 10にアップデートするとPlaygroundsが表示されています。

f:id:marikooota:20160815181041p:plain

2.起動するとこのような画面が起動されます

f:id:marikooota:20160815181144p:plain

3.画面下部にコードの入力補助が出てくるので、タップすると簡単にコードを書くことができます。
moveForward()・・・前に進む
collectGem()・・・・宝石をゲット
赤い宝石をゲットできるようにコードを組んだら、「Run My Code」をタップしてキャラクターを動かします。

f:id:marikooota:20160815181222p:plain

4.成功!

f:id:marikooota:20160815181639p:plain

まだ最初の3回分しかやってみていないですが、他にもできることが沢山あって遊びがいがありそうです。
子供でもゲーム感覚でコードを組むことができるので、プログラミング学習の第一歩目にはピッタリじゃないかなと思いました。
私でもめちゃくちゃ楽しめました。


セッションでは資料のコードを見ながら説明してくださいました。Swiftビギナーズ勉強会サイトのFacebookから閲覧することが可能です。

Facebook: https://www.facebook.com/groups/swiftbg/

もくもく会で書いたコード

ショートセッション後のもくもく会では、前回のブログで作っていたアプリに画面遷移の機能を加えていたので、そのコードの修正をしました。
綺麗なコードに生まれ変わりました。

ViewController.swift

画像をスクロールバーに追加する部分(前回のコードを修正)

 @IBOutlet weak var scrollview: UIScrollView!
    @IBOutlet weak var imageView: UIImageView!
    
    let nanaFace = UIImage(named:"nanaFace.png");
    
    let mura = UIImage(named:"mura_eye.png");
    let nana = UIImage(named:"7_eye.png");
    let maro = UIImage(named:"maro_eye.png");
    
   
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "Chose your eyes"
        
        // 三つの画像を配列に加えます
        let images = [mura, nana, maro]
        
  // UIImageViewにUIIimageを追加
        var imageViews = [UIImageView]()
        for image in images {
            imageViews.append(UIImageView(image:image)) // appendで追加
        }
        
        scrollview.frame = CGRectMake(0, 0, 200, 300)
        
        scrollview.contentSize = CGSizeMake(240*3.8,0)
        
        // UIImageViewのサイズと位置を決める(x,y,width,height)
  // 画像同士の間隔と画像サイズを足してXポジションの位置を決める
        var xPosition : CGFloat = 100
        for image in imageViews {
            let size: CGFloat = 180
            let space: CGFloat = 20
            image.frame = CGRectMake(xPosition, 0, size, size)
            xPosition = xPosition + size + space
        }

        // ImageViewにアクションをつけれるようにする
        for image in imageViews {
            image.userInteractionEnabled = true
        }
        
        // 関数を呼び出す
        for image in imageViews {
            let tapRecognizerImage = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapImage))
            image.addGestureRecognizer(tapRecognizerImage)
            
            tapRecognizerImage.delegate = self;
        }
        
        // UIImageViewをScrollViewに追加
        for image in imageViews {
            scrollview.addSubview(image)
        }
        
        // 1ページ単位でスクロールさせる
        scrollview.pagingEnabled = true
    }

画面遷移部分

   func tapImage(sender: UITapGestureRecognizer) {
        if let imageView = sender.view as? UIImageView { //※1
            performSegueWithIdentifier("toViewController2",sender: imageView) //※2
        }
    }

    // Segue 準備
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if let imageView = sender as? UIImageView {
            if (segue.identifier == "toViewController2") {
                let vc2: ViewController2 = (segue.destinationViewController as? ViewController2)!
                // 遷移先のUIImageViewに選択した画像を設定
                vc2.imageKii = imageView.image
                // 遷移先の背景になる画像を設定
                vc2.imageFace = nanaFace
            }
        }
    }

※1 as?と記述すると型変換(ダウンキャスト)が成功するかわからない場合に使用する。失敗した場合にはnilが返る。強制ダウンキャストの時はas!を使う。

※2 performSegueWithIdentifier("SegueのIdentifier", 画面遷移のsender)

ViewController2.swift
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var imageViewFace: UIImageView!
    
    var imageKii : UIImage?
    var imageFace : UIImage?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        if(imageKii != nil){
            imageView.image = imageKii
        }
        if(imageFace != nil){
            imageViewFace.image = imageFace
        }
    }

実行します。

  • 初期画面

f:id:marikooota:20160815165335p:plain

  • むらちゃんの目をタップした時

f:id:marikooota:20160815165410p:plain

  • 7ちゃんの目をタップした時

f:id:marikooota:20160815165434p:plain

  • マロくんの目をタップした時

f:id:marikooota:20160815165458p:plain

完!

Swiftで遊ぼう!Swift Playgroundsやってみた! #swiftbg | TickleCode
[iPhone] UITapGestureRecognizer と Segue を使い、タップして画面遷移させるやり方
【Swift】Storyboardの画面遷移(push)をコードから呼ぶ - Qiita
isとasの挙動についていろいろ試す - Qiita
Swift as!について - Qiita