HOME > 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 SwiftSalarymanProtocol{
func loveSwift()
func hateSwift()
}
これはloveSwiftとhateSwiftを強制的に追加しないといけない状態になります。
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でした。
funcの前にoptionalを追加します。これだけだとエラーがでますので、protocol の前に@objcを追加してください。
@objc protocol SwiftSalarymanProtocol{
func loveSwift()
optional func hateSwift()
}
この状態だとhateSwiftを追加しなくてもエラーは発生しません。
2021-05-14 14:21:41 | WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。
AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、
昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は... |
2021-05-06 14:04:37 | LINEのアニメーションスタンプ制作の落とし穴、、、失敗談
ゴールデンウィークにLINEスタンプを作成してみました。
作り切って申請も通したんですが、意図したアニメーションと違う、、、、
LINEクリエーターの画面だと、アニメーションのプレビュー... |
2021-05-01 18:05:35 | 久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。
忘れないようにメモ
エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。
ターゲット→ex... |
Tweet | |||
|