Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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を追加しなくてもエラーは発生しません。

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

Backslashを忘れない

ショートカットキーで(\)を入力するには「optionキーを押しながら、¥キーを押す」で可能なのですが、 なにかと、あれ、、、なんだったっけ?と忘れる事が多かったので、バックスラッシュ拡大表示。

CoreTextでTextViewの一文字の向きを変える(解決前)

TextViewの文字を縦書きにしたいなぁと考えている時にCoreTextとNSMutableAttributedStringの二つのどちらかなら実装できそう。CoreTextを利用してトライして無理ならAttributedStringをトライしてみます。

UIWebView

アプリの中にWebビューを作成して外部ネットワークやローカルのhtmlやcssやjsファイルと連携する方法の説明です。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!