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

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

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

The pitfalls of Filetransfer in watchconnectivity on WatchOS. And how to avoid.

AppleWatch it succeeds with the actual machine, but if it is a simulator, it will fail、、、 When I...
2021-05-06 14:04:37

Line's animation stamp production pitfalls 、、、 failure story

I tried to make a LINE sticker during Golden Week. I made it and applied, but it was different f...
2021-04-22 14:54:53

Cool carousel carefully selected 3 points! Astringent image slider using WebGL.

I was on a trip to find a cool slider yesterday. It's simple, easy to use, and has a good de...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!