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 | The pitfalls of Filetransfer in watchconnectivity on WatchOS. And how to avoid.
AppleWatch it succeeds with the actual machine, but if it is a simulator, it will fail、、、
When I... |
2021-05-06 14:04:37 | Line's animation stamp production pitfalls 、、、 failure story
I tried to make a LINE sticker during Golden Week.
I made it and applied, but it was different f... |
2021-04-22 14:54:53 | Cool carousel carefully selected 3 points! Astringent image slider using WebGL.
I was on a trip to find a cool slider yesterday.
It's simple, easy to use, and has a good de... |
Tweet
![]() |
|||
|