万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    Swiftの必須ではないProtocol(インターフェス)

    たまにプラグインで必須じゃないメソッドがあるProtocol(インターフェイス)みたいなのをたまに見る。 実装というか準拠先にインターフェイス

    プロトコルの場合は「継承する(させる)」ではなく「準拠する(させる)」

    どうやるのか調べた。

    https://stackoverflow.com/questions/24032754/how-to-define-optional-methods-in-swift-protocol

    protocol MyProtocol {
        func doSomething()
    }
    
    extension MyProtocol {
        func doSomething() {
            /* return a default value or just leave empty */
        }
    }
    
    struct MyStruct: MyProtocol {
        /* no compile error */
    }

    extensionを用意すればいいのか!?

    と思ったが、 delegate?.doSomething() したとき準拠したクラスのメソッドで doSomething が呼ばれない・・。 extension MyProtocol のがそのまま呼ばれてる?

    これがいい!

    Raphael氏のを参考に警告がうざいので AnyObject にした。 @objcプロトコル側にもいる

    @objc protocol MyProtocol: AnyObject {
        func doSomething()
        @objc optional func doSomething()
    }

    呼ぶ時は delegate?.doSomething?() みたくメソッド自体がオプショナルなので () の前に ? がいる模様。