【Xcode】@IBActionで紐付けする時にsenderを変更する方法

 UISwitchのON/OFFを切り替えるには、@IBActionのsenderをUISwitchにしなければならない。

 

しかし、普通に紐付けすると、senderがAnyになってしまい、手作業でsenderをUISwitchに書き換えなければならない。

 

だが、またまたコミュニティでそのことを質問したら、簡単な解決方法を教えてもらったので、備忘録として残す。

 

 

紐付けする際、Type欄をAny → UIButtonに変更する

(今回はUIButtonを例にする)

f:id:nekokichi_yos2:20181015134037p:plain

 

 

Nameも設定したら、Connect。

f:id:nekokichi_yos2:20181015134039p:plain

 

 

結果、senderがUIButtonになった

f:id:nekokichi_yos2:20181015134042p:plain

【Swift】ターミナルでコードを即座に実行する方法

Xcodeで記述したコードが正しく実装できるかの動作テストは、

 

  • XCTest
  • シミュレータ
  • 実機

 

でなければ不可能。

 

しかし、ただ”コードの動作テストだけ"なら、ターミナルで実行することができる。

 

ターミナル上で、

 

$ swift

 

と打てば、コマンドシェル?(対話型スクリプト?)に移行する。

(移行までに少し時間がかかるが気にする必要なし。)

f:id:nekokichi_yos2:20181015124218p:plain

 

 

変数宣言、出力、for文、なども普通に実行可能。

f:id:nekokichi_yos2:20181015124221p:plain

 

 

関数だって実行できちゃいます。

f:id:nekokichi_yos2:20181015124223p:plain

 

 

終了するときは、Ctrl + D。

(exitを入力しても終了しなかった)

f:id:nekokichi_yos2:20181015124226p:plain

 

 

残念ながら、

  • アラート
  • カメラ起動
  • セルの表示

などの実機でしか確認できない処理はおそらく無理..だと思う。

(試してないからわからない。)

 

だが、値や関数がどのように実装されるかを確かめるなら、こちらの方が圧倒的に早い。

 

アルゴリズムの実装ならターミナルに軍配が上がるだろう。

【Swift】senderを駆使した値渡し遷移

以下の記事で、値を渡しながら遷移する方法を述べた。

nekokichi2yos2.hatenablog.com

 

しかし、その後にTwitterで違う方法で実装できる方法を返信ツイートで教えてもらったので、残す。

 

解説

 

 ・普通なら、渡す用の変数に渡したい値を渡し、その変数をprepare内で遷移先に渡す方法を行なっていた

・今回の方法では、渡したい値をperformeSegueのsenderに渡し、prepare内で宣言した変数にsenderを代入している

・つまり、①渡すための変数の宣言文、②変数に渡したい値を代入する文、この2つを省略できる

 

・エラーのことを考えて、guard let文で実装

 

コード

 

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loadinvarhe view, typically from a nib.
    }

    @IBAction func first(_ sender: Any) {
        performSegue(withIdentifier: "perform", sender: "first")
    }
    
    @IBAction func second(_ sender: Any) {
        performSegue(withIdentifier: "perform", sender: "second")
    }
    
    @IBAction func third(_ sender: Any) {
        performSegue(withIdentifier: "perform", sender: "third")
    }
    
    //遷移する際の処理
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "perform" {
            guard let svc = segue.destination as? SecondViewController else { return }
            guard let text: String = sender as? String else { return }
            svc.text = text
        }
    }
    
}

 

【Swift】UserDefaultsに値を保存・取り出す方法

 

完成図

 

 

解説

 

・UserDefaults:アプリ内に値を保存する

・UserDefaults.standard.set(保存したい値, forKey:"好きなキー"):値を保存

・UserDefaults.standard.object(forKey:"好きなキー" ):setで設定した同じキーを入力

・let 変数 = UserDefaults.standard:これ以降、変数.set, 変数.object、と省略できる

 

・値を取り出すときは、変数 : String = UserDefaults.standard.object(...) 、とそのまま代入できる

 

※注意点

・アプリを削除すれば、保存したデータも削除される

 

ストーリーボード

 

f:id:nekokichi_yos2:20181013233427p:plain

 

ソースコード

 

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {
    
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        //もしUserDefaultsに値が登録されてるなら
        if let _ = UserDefaults.standard.object(forKey: "text") as? String {
            //labelに表示
            label.text = (UserDefaults.standard.object(forKey: "text") as! String)
        }
        
    }

    @IBAction func registerButton(_ sender: Any) {
        //UserDefaultsに値を登録
        UserDefaults.standard.set(textField.text, forKey: "text")
        //登録された値を表示する
        label.text = (UserDefaults.standard.object(forKey: "text") as! String)
    }
    
    //画面をタップした時
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //キーボードを閉じる
        textField.resignFirstResponder()
    }
    
}

【Swift】画面遷移しながら値を渡す方法

 

完成図

 

 

解説

 

・performSegue:指定したIdentifierのSegue(遷移)を実行する

・prepare:遷移する際に実行したいコードを実行する

 

・実際に遷移先の変数やメソッドなどに値を渡すコードは、prepare内で実装する

・他にも遷移する方法が色々あるが、performSegueとprepareを使う方法が1番安全で簡単

 

※注意点

・遷移先のlabel.textに直接代入することはできない(nilのエラーが起きる)

・値を受け取るための変数を用意し、その変数の値をlabel.textに代入するべき

 

ストーリーボード

 

f:id:nekokichi_yos2:20181013232017p:plain

 

ソースコード

 

import UIKit

class ViewController: UIViewController {
    
    //値を渡す
    var text = String()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loadinvarhe view, typically from a nib.
    }

    @IBAction func first(_ sender: Any) {
        handOver("first")
        performSegue(withIdentifier: "perform", sender: nil)
    }
    
    @IBAction func second(_ sender: Any) {
        handOver("second")
        performSegue(withIdentifier: "perform", sender: nil)
    }
    
    @IBAction func third(_ sender: Any) {
        handOver("third")
        performSegue(withIdentifier: "perform", sender: nil)
    }
    
    //引数をtextに渡すだけ
    func handOver(_ word:String) {
        text = word
    }

    //遷移する際の処理
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "perform" {
            let svc = segue.destination as! SecondViewController
            svc.text = text
        }
    }
    
}

---------------------------------------------

import UIKit

class SecondViewController: UIViewController {
    
    @IBOutlet weak var label: UILabel!
    
    //ViewControllerから値を受け取る
    var text = String()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    //viewWillは、viewが生成される前なので、
    //既にlabel.textが切り替わってるように見える
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        //受け取った値を代入
        label.text = text
        
    }
      //viewDidの方だと、label.textの切り替わりが遅い
//    override func viewDidAppear(_ animated: Bool) {
//        super.viewDidAppear(animated)
//
//        label.text = text
//
//    }
    
    //前画面に戻る
    @IBAction func backButton(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }
    
}

 

 

【yukicoder】No.692 square1001 and Permutation 1

 

使用言語

 

Python 3

 

問題文

 

No.692 square1001 and Permutation 1 - yukicoder

 

解法プロセス

 

1、最後のPermutaionを食べた方の負け
2、Petrが先手、square1001が後攻
3、1人1個以上食べて良い→100個,1000個食べても良い
4、nが2個以上なら、1個残るように食べれるので、必ずPetrが勝つ
5、nが1個だけなら、最後の1個を食べることになるので、Petrが負ける

 

回答

 

n = int(input())
if n > 1:
    print("Petr")
else:
    print("square1001")

 

【yukicoder】No.700 LOVE

 

使用言語

 

Python 3

 

問題文

 

No.700 LOVE - yukicoder

 

解法プロセス

 

1、入力した数字の回数だけリストに入力
2、上から順に1行の中に’LOVE’の存在を調べればいい

 

回答

 

n1,n2 = map(int, input().split())
l = [input() for _ in range(n1)]
    
for i in l:
    if 'LOVE' in i:
        print('YES')
        break
else:
    print('NO')