19
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Delegateってなんやねん(iOS App, Swift)

Last updated at Posted at 2015-12-06

Delegateってなんやねん(iOS App, Swift)

iOSアプリ作るにあたってまず引っかかるであろうDelegateという概念

委譲とは言うものの自分の思ってるイメージで正しいんやろかーって

わかっているようでわかっていない状況な人が多いと思うので

踏み入った話になる前の基本的な概念イメージをまとめてみました

環境

OS Version
Mac OS Mac OS X Yosemite
Xcode 7.1.1
Swift 2.1
iOS 9.1

基礎用語

用語 説明
Delegate(デリゲート) 委譲(今回のメイン題材)
Segue(セグエ) 画面遷移手法(昔で言うモーダルとかそういうViewControllerの遷移系をまとめたイメージ)
Protocol(プロトコル) 要約するとインターフェースのこと

説明

説明の流れとしては

  • 言葉で軽い説明
  • 図で概念イメージ
  • 実装と結びつけ

って感じ

軽い説明

任せたいことを定義しておいて委譲する感じ。

このClassには属する処理やねんけど、ここだけは他のClassにやってもらおう。(委譲)

人にやらせるんやから、やらせ方を定義しておかないと(Protocol)

以下はClassAがClassBに雑用を投げるがBには押印の権限が無いので押印処理だけはAに委譲するストーリー

図説

delegate.png

簡単な実装イメージ

Class A

import UIKit

/**
 * ここが①
 * 押印は俺にはできひんから任せるでー的な(委譲)
 * protocolという形でいわばインターフェースのようなものを定義
 */
@objc protocol BViewControllerDelegate: NSObjectProtocol {
    func push(sign: String)
}

class BViewController: UIViewController {

    
    weak var delegate: BViewControllerDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
    }

    /**
     * ここが④
     * IBActionである必要は無いけど、例えば雑用の中で押印ボタンが押されたようなイメージ
     */
    @IBAction func signButton(sign: String) {
        delegate?.push(sign)
    }
}

Class B

import UIKit

class MainViewController: UIViewController, BViewControllerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

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

    /**
     * ここが② (zatsuyouOshitsukeとperformSegueWithIdentifier)
     * セグエで遷移して雑用を任せようとしてるところ
     */
    @IBAction func zatsuyouOshitsuke(sender: AnyObject) {
        performSegueWithIdentifier("segue",sender: nil)
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if(segue.identifier == "segue") {
            let vc: BViewController = segue.destinationViewController as! BViewController
            vc.delegate = self//③の「あ、困ったら俺呼べよ」の部分
        }
    }
    
    /**
     * ここが⑤
     * 押印の仕方をProtocolに則って実装
     */
    func setKey(sign: String){
        print(sign)
    }
}
19
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?