【新サービス告知】いつでもどこでもイベントを開催できる。スマホのWebカメラを利用したVRイベントスペースサービス(Meetatcube.com)
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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-04-22 14:54:53

かっこいいカルーセル厳選3点!WebGLを使った渋い画像スライダー。

昨日カッコいいスライダーを探す旅にでていました。 よく使われるswiper など、シンプルで使いやすくデザインも良いのですが、何かもの足りない、、、。 そこで調べていくと、webglを使...

2021-04-20 14:46:43

Twillioとは何??skywayとは何が違うのか。webrtcを使う際に判断する情報。

先日webrtc開発で「twillio」といった名前を聞きました。 以前自分でskywayを使ってwebrtcを試していた際に調べた時には、無かったような気もするんだけと、KDDIが絡んでいる...

2021-04-19 13:58:21

先日久々にアップデートした妊娠週刊パパのAndroid版も。アカウント移管したいんだけど、注文ID見当たらないよ。

先日の妊娠、出産、育児関連のアプリ「妊娠週刊パパ」をAndroid studioで再リリースしようと思ってるんだけど、コンパイル失敗してエミュレータで動かせない。 多分sdkとかapiのバージ...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!