↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > Protocol

Protocol

プロトコルサンプル画像


どうやらswiftのプロトコルはJavaやActionScriptでいうInterface(ルール決め)の様です。このクラスは必ずA,B,Cの関数や変数を持たないとダメですよ!とルールをつけてあげることができます。

多くの人が同時に開発していたりすると、開発者も千差万別色々な方法でコーディングされますが、こういった規制があれば基礎部分は一定になり横とのつながり、別の開発者との連携等も 明確に連携しやすくなる利点があります。

SwiftやObjectivce-CではDelegateという記述に悩まされます。このDelegateはProtocolによって設計されているのです。

例えばWebViewのクラスをUIViewControllerに配置した場合、WebViewのイベントを親のViewControllerが 受け取ることができるようにdelegateを利用するのですが以下のようなprotocolになっています。


        //変数宣言
        unowned(unsafe) var delegate: UIWebViewDelegate?
            

        //protocol内部
        protocol UIWebViewDelegate : NSObjectProtocol {
    
        optional func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool    
            optional func webViewDidStartLoad(webView: UIWebView)
            optional func webViewDidFinishLoad(webView: UIWebView)
            optional func webView(webView: UIWebView, didFailLoadWithError error: NSError)
        }
        
        

上記のProtocolを親Viewに追加している場合、開発者はwebViewDidStartLoad等を親View実装することで適切な関数にアプローチできるようになります。

ただしoptionalが付いているので「強制力」に関してはありません。親Viewに委任している状態で、 「よかったら使ってね、これだけ揃えているよ」といったスタンスなのかと思います。以下、強制力のあるProtocolを記載してみます。


参考:プロトコルとデリゲートのとても簡単なサンプルについて

強制力のある独裁的Protocol


まず以下のProtocolを作成してみます。


protocol SwiftSalarymanProtocol{
    func loveSwift()
    func hateSwift()
}

これはloveSwifthateSwiftを強制的に追加しないといけない状態になります。


       class ViewController: UIViewController,SwiftSalarymanProtocol {
            override func viewDidLoad() {
                super.viewDidLoad()
            }
            ...
       }
       

上記の状態だとランタイムエラーが発生します。理由はルール違反をしたからです。必ずloveSwiftとhateSwiftを 追加する必要があるからです。


       class ViewController: UIViewController,SwiftSalarymanProtocol {
            override func viewDidLoad() {
                super.viewDidLoad()
            }
            func loveSwift() {
            }
            func hateSwift() {
            }
            ...
       }
       

この状態だとエラーなくコンパイルが可能です。独裁的なProtocolでした。

hateSwiftだけは独裁ルールから外したい場合


funcの前にoptionalを追加します。これだけだとエラーがでますので、protocol の前に@objcを追加してください。


@objc protocol SwiftSalarymanProtocol{
    func loveSwift()
    optional func hateSwift()
}

この状態だとhateSwiftを追加しなくてもエラーは発生しません。

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!