iOS

[Swift] プロトコルを弱参照するために

投稿日:

はじめに

こんにちはsuzukiです。久しぶりにSwiftの記事を投稿します。
アーキテクチャの都合上仕方ないのですが、プロトコルだらけのコードを読んでます。

プロトコルとは

手順書とか決まりごとのような表現がされていますが、概ねその通りだと思っています。
例えばIntやStringで比較を行う際に ==< を使います。
==< で比較できるのはIntとStringがComparableと言うプロトコルに準拠して作られているためです。
クラスの継承と似ているように思えますが異なります。
使用シーンの違いなどはこちらのサイトが参考になるかと思います。

    プロトコル

  • 複数のプロトコルを設定できる
  • 準拠する対象を意識せず設定できる
  • 構造体や列挙型でも利用できる
    クラス継承

  • 複数のクラスを継承できない
  • 親クラスを継承する為親のクラスを意識する必要がある
  • 構造体は継承できない

プロトコルの作成方法

プロトコルを作成するには下記のようなコードになります。

    プロトコルで宣言できる内容

  • 関数
  • インスタンスプロパティ・タイププロパティ
  • イニシャライザ
  • typealias
  • 添字付け

面積を返す関数を持つ図形プロトコルを定義すると下記のようなコードになります。

プロトコルを採用したクラス作成

作成したプロトコルを採用するには下記のように記述します。

これだけだとTriangleクラスがFigureプロトコルに準拠していないということでエラーが発生します。
Type 'Triangle' does not conform to protocol 'Figure'
Figureプロトコルで func culcArea() -> Float という関数を宣言したので、プロトコルを採用したクラスでは宣言された関数を実装しなければなりません。

使用例

構造体に採用することも可能ですし、プロトコルを採用されていれば配列にまとめることも可能です。
試しに少しコードを書いてみました。

ClassOnlyProtocolとは

前の章で構造体や列挙型にもプロトコルの使用が可能と書きましたが、構造体と列挙型等に制限を行いクラスのみで設定できるプロトコルを作成する事も可能です。

メリット

こちらを使うメリットとしては、参照を渡す場合に弱参照のweakを設定できるようになります。
デリゲートなどで相手のインスタンスを参照するような場合には弱参照で保持し循環参照を防ぐことができます。

AnyObjectを指定しない場合は
'weak' must not be applied to non-class-bound 'FigureDelegate'; consider adding a protocol conformance that has a class bound
上記のようなエラーが表示されます。
エラー原因はそもそも弱参照は参照型に対してのみ定義できます。
プロトコルは参照型(クラス),値型(構造体、列挙型)全て設定できるため、weakを設定しているのに値型が入る可能性があります。

使用例

最後に

プロトコルの設定方法をまとめさせていただきました。
プロトコルの拡張は複雑になっているため、また今度改めてまとめられたらと思っております。

おすすめ書籍

詳解 Swift 第4版 リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice) よくわかるAuto Layout iOSレスポンシブデザインをマスター

blog-page_footer_336




blog-page_footer_336




-iOS
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

swift

[Swift3] Segmentを使った画面切り替え (Extra View)

1 はじめに1.1 前提条件2 Segmentの用意3 表示したいViewを用意4 Extra Viewsに追加5 Segmentでの切り替え5.1 デフォルトで表示されるViewを設定5.2 Seg ...

【Swift】WKWebViewのWKUserContentControllerで循環参照

1 はじめに2 循環参照が起きた原因2.1 実装2.2 実装の問題の箇所2.3 修正方法3 さいごに4 おすすめ書籍 はじめに こんにちはsuzukiです。今回はwebviewのWKUserConte ...

swift

[Swift]動画撮影にて好きなサイズでプレビュー表示する

1 はじめに1.1 前提条件2 実装3 さいごに はじめに こんにちは、nukkyです。 今回はメインのビューの右上とかに小窓の様なプレビューにカメラの映像を出して、動画撮影するという機能を作成したの ...

iOS14のWidget機能を使ってみた。

1 はじめに2 Xcode 12 betaの入れ方3 WidgetExtensionの追加方法4 デフォルトのコード説明5 Configurationについて6 プロバイダー6.1 snapshot6 ...

Flutter開発のはじめかた 開発環境セットアップ〜Widtgetの解説

1 はじめに2 セットアップ2.1 Flutterのインストール2.1.1 Android環境のセットアップ2.1.2 Xcodeのインストール2.1.3 IDEのセットアップ(Android Stu ...

フォロー

blog-page_side_responsive

2018年11月
 123
45678910
11121314151617
18192021222324
252627282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。