すだちキャンパス

すだちキャンパス

やってみたこと、学んだことなどのメモ。

画面遷移時の値の受け渡し方 (Swift)

こんにちは。
Swift の、画面遷移時の値の受け渡しについて調べることがあったのでまとめました。

値の受け渡し方

まず、2画面あって Segue で繋いだ状態にします。この時、Segue の identifier に名前をつけておきます。
(ここでは toSecond としました)
f:id:sweetgohan:20181021220923p:plain
左画面の数字がボタンになっているので、それを押して右側の画面に移動すると、数字に対応する食べ物の名前が表示されるというものを作ります。

Storyboard に配置したボタンやラベルと swift のソースコードを紐付けます。
次に、ViewController.swift に以下のコードを書き足します。
myText は、ViewController2.swift で定義する変数です。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toSecond" {
            let viewController2 = segue.destination as! ViewController2
            viewController2.myText = sender as! String
        }
    }

@IBAction func toSecond(_ sender: UIButton) {
        //画面遷移させたいボタンの中に書く
        self.performSegue(withIdentifier: "toSecond", sender: number.text) // sender で指定したものを渡せる
    }

ここでは、number という名前の label に表示させたテキストを渡すので、sender: number.text としています。
最後に、ViewController2.swift に以下のコードを書き足します。

    var myText: String?

//↓元から書かれているコードの中に書く
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var num:Int = Int(myText!)!
        if num == 1 {
            label.text = myText! + " Ramen"
        } else if num == 2 {
            label.text = myText! + " Curry"
        } else if num == 3 {
            label.text = myText! + " Beef Don"
        }

        // Do any additional setup after loading the view.
    }
結果


調べたこと覚書

  • ! や ?

型が明確に決まっていない時に ? を使って、決まった時に ! を使う・・・みたいな感じなのか?あまりわかっていない。

  • func prepare(for segue: UIStoryboardSegue, sender: Any?)

「遷移するから準備してね」という関数みたいです。

segue で移動するときの、 ViewController の目的地

  • as

型変換を行うらしい。この場合だと、変数にクラスを突っ込んでいる?

クラスと継承 (勘違いしていたこと)

初めに調べた時、「変数 共有 やり方」などで調べていて出てきたのが「クラスとその継承」でした。
しかし、おそらく画面遷移時の値の受け渡しにはあまり関係ありませんでした。
クラスやそれの継承が必要になるのは、同じようなセットの処理を複数回行う時のようです。
例えば、以下のような感じでしょうか。

class cat{
    var age:Int 
    var type:String
    
    init(age0:Int, type0:String){
        age = age0
        type = type0
    }
    
    func say(){
        print("nyan")
    }
 
}

class dog:cat{
    init(){
        super.init(age:2, type: "Shibaken")
    }

    override func say() {
        print("wan")
    }
}