Swift の Optional のメモ

Swift の Optional についてのメモ。 型の後ろにつく「?」や「!」がわからなかったので調べつつ動作確認をしたのでメモ。

[Swift] Optional型についてのまとめ

http://qiita.com/edo_m18/items/ca8c9c21049c280d3328

[Swift] 「!」、「?」マーク(Optional)についてのメモ

http://qiita.com/cotrpepe/items/e30c7442733b93adf46a

のあたりを読みつつ動作確認。以下はその結果。

        // var prop: Optinal<String> と同義. optional でラップされる
        // ? はnilの可能性を含む.
        var prop: String?
        
        // var prop2: ImplicitlyUnwrappedOptional<String> と同義
        // ! は ? でラップされた状態をアンラップする
        var prop2: String!
        
        
        // 確認1: ?, ! を利用した場合の 初期値 nilセット
        var hoge:String? = nil // OK nil は OK
        var hoge1:String! = nil // OK これはなぜ?初期値に nil がセットできるのは問題では?
        //var hoge2:String = nil // NG nil は NG
        var hoge2:String = "hoge" // OK nil 以外なら OK
        
        // 確認2 ?, ! で宣言した変数に対するメソッド実行(と、実行時に ?,! を指定した場合)
        
        // ?の場合
        // エラー。Optinal<String>の記法の通り wrap されているので、直接 String のメソッドは利用できない。静的解析のタイミングでエラー
        var value1 = hoge.toInt()
        
        // OK。 hogeがnilかチェックをしてくれる。hogeがnilの場合は toInt は実行しないので実行時エラーにはならない。 nil 出ない場合に実行される
        var value2 = hoge?.toInt()
        
        // 実行時エラー。 ! で String としてアンラップしており、コンパイルは通るが、実際には nil なので実行時エラーになる
        var value3 = hoge!.toInt()
        
        
        // !の場合
        // 実行時エラー。 コンパイルは通るが、実際には nil なので実行時エラーになる
        var value4 = hoge1.toInt()
        
        // OK。 hogeがnilかチェックをしてくれる。hogeがnilの場合は toInt は実行しないので実行時エラーにはならない。 nil 出ない場合に実行される
        var value5 = hoge1?.toInt()
        
        // 実行時エラー。 ! で String としてアンラップしており、コンパイルは通るが、実際には nil なので実行時エラーになる
        var value6 = hoge1!.toInt()

        
        // ?も!もなし
        // OK。
        var value7 = hoge2.toInt()
        
        // エラー。 hoge1 は optionalType ではないので ? は使えない. 静的解析のタイミングでエラー
        var value8 = hoge2?.toInt()
        
        // エラー。 hoge1 は optionalType ではないので ? は使えない. 静的解析のタイミングでエラー
        var value9 = hoge2!.toInt()

Swift で UITableView の実装

Swift で UITableVIew を使ってみます。

手順

  1. StoryBoard で UITableView, UITableVIewCell を配置する。
  2. ViewControllerでは、UITableViewDataSource, UITableViewDelegateを継承し、初期処理でdeletegate,dataSourceの設定を行う。

 ※もちろんStoryBoardからの設定でも可 3. 必要なdelegateメソッドを実装する。以下実装例です。

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet var tableView: UITableView
    var items:Array<String> = ["one", "two", "three", "four"]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.tableView.delegate = self
        self.tableView.dataSource = self;
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        let cell: UITableViewCell =  tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell!
        cell.accessoryType = UITableViewCellAccessoryType.Checkmark
        cell.textLabel.text = "\(self.items[indexPath.row])"
        cell.detailTextLabel.text = "Subtitle index : \(indexPath.row)"
        return cell
    }
    
    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
        // 選択するとアラートを表示する
        let alert = UIAlertView(title: "alertTitle", message: "selected cell index is \(indexPath.row)", delegate: nil, cancelButtonTitle: "OK")
        alert.show()
        
    }

objective-c の頃とほとんど同じ手順で実装できます。 ただ、これだとcellのaccessoryTypeが効かない模様。 何か設定が足りない?betaだから??継続調査。。

色々触ってみたところ、TableViewの幅が画面を超えていただけのようでした。 試しに極端に短くしてシミュレータ上に表示しきれるようにするとちゃんと表示されました。

なお、画面にFitするようにするには、

  1. StoryBoard上でTableViewを貼り付け元のViewと同サイズにする
  2. TableVIewを選択し、pin をクリック(右下の |-□-| というやつ)
  3. Spacing to nearest neighbor で左右を固定

とすればOK。

この辺りは Auto-Layout, Constrains というキーワード辺りの話しになりますがまだまだ勉強が必要そうです。

Markdown記法のおさらい

Marddown記法について

wikipedia その他もろもろにも書かれてますが改めて確認


強調

書き方:

*強調*

結果:

強調



見出し

書き方:

# 見出し1, ## 見出し2, ### 見出し3, #### 見出し4

結果:

見出し1

見出し2

見出し3

見出し4



コード

書き方:

`var hoge = "aa"`
または
 ```
 var hoge = "aa" 
 ```

結果

var hoge = "aa"

 var hoge = "aa" 

※```の場合は言語を指定することで言語に合わせた色にできる 上記にjavascriptを指定すると、

 ```javascript
 var hoge = "aa" 
 ```

 var hoge = "aa" 

となる



リスト

書き方:

* リスト

結果

  • リスト
    • サブリスト

※半角スペース4つ開けて * を書くと上位のリストのサブリストになる(2つでもOKな場合もある)

※番号付きにしたい場合は * ではなく 1. 2. …をつかう

1. リスト1
2. りすと2
3. りすと3

  1. リスト1
  2. りすと2
  3. りすと3


リンク

書き方:

[リンクのテキスト](リンクのアドレス "リンクのタイトル")

結果:

[Google](http://www.google.com "ツールチップですな")
の場合

Google



書き方:

|foo|bar|hoge|
|-|-|-|
|おはようございます|こんにちは|こんばんわ|
|1|2|3|

結果:

foo bar hoge
おはようございます こんにちは こんばんわ
1 2 3

vagrantメモ

基本の基本のお勉強です。

vagrantの使い方

 

初期化

    #vagrant init <box名>

init を実行すると vagrantfile ができる

起動するには

起動

    #vagrant up

とすることでVMを起動することができる。 起動したVMに繋ぐには

接続

    #vagrant ssh

とするだけでOK。 終了するときは

終了

    #vagrant halt

とすればよい。

なお、vagrant のサイトにあるubuntuGUIがない。 もしもこのboxをGUIで起動したい場合は

sudo apt-get install xfce4
sudo add-apt-repository ppa:gnome3-team/gnome3
sudo apt-get update
sudo apt-get install gnome-shell
sudo apt-get install ubuntu-desktop
sudo apt-get install gdm
sudo dpkg-reconfigure gdm

を実行した後に、vagrantfile を修正する。
具体的には以下のコメントアウトを外す。

    vb.gui = true

これでvagrant upをすると画面が立ち上がる(ったはず)。 ただし、この手順をした後は、/vagrantフォルダの共有設定が解除される模様。 なので、再度共有設定が必要になる。

ローカルに保存

iPhoneアプリでデータキャッシュするためのメモ。

大変参考になりました。

 

(iOS)サーバーから取得した情報をローカルにキャッシュしておき、オフラインの時はキャッシュ情報を参照するAdd Star

http://d.hatena.ne.jp/okahiro_p/20121101/1351759821

画面遷移

画面遷移させたい場合のざっくり手順メモ

1. Navigation Controllerを配置

2. VIew Controller を配置

3. Navigation Controller にボタンなど遷移のトリガになる要素を配置

4.3.の要素から2.の画面に向かってctrl + DnD で遷移を追加する

これだけで、とりあえず好きな画面に遷移が可能。

いろいろメモ(UIView Titleのカスタマイズ、サイズ指定)

本日のいろいろメモ

・UIView のTitleをカスタマイズする方法。

 http://www.yoheim.net/blog.php?q=20121203

 

・Viewを画面いっぱいに配置する

 http://d.hatena.ne.jp/mizop/20111205/1323104955

  

 これは、UIWebView を画面いっぱいにして表示する例

f:id:espoirka:20130518134556p:plain