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

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

SwiftData+SqliteのDBファイル保存+Libraryフォルダから読込

さて、私の目標は事前に作成したSqliteのDBファイルをSwiftDataで読み込むことですので、その一連の作業を以下説明してまいります。

URLエンコードとデコード

サーバとデータのやりとりをしているとURLエンコードしないと文字化けしちゃったりと問題がでる場合があります。 phpのurlencodeやurldecodeと連携させる場合等、Swift側でどうやってエンコードすれば良いかの方法を記載しております

AppleWatchをNSFileCoordinatorとKeychainでデータ交換

前回の記事(ナターシャさんのサンプルデモを元に解説)の続きです。今記事はNSUserDefaultではなく、 NSFileCoordinatorとKeychain sharingを利用しての解説です。ナターシャさんのサンプルに関して前記事をご参照ください。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!