0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Swift】型の構成要素〜エクステンション〜

Last updated at Posted at 2020-12-14

#エクステンションとは
エクステンションは、すでに存在している型に要素を追加し、型を拡張することを言います。
追加できる要素としては、プロパティやメソッド、イニシャライザなどが挙げられます。

##定義方法
エクステンションはextensionキーワードで宣言することができ、
{ }内に型を構成する要素を定義します。


extesion エクステンションを定義する対象の型 {
   対象の型に追加したい要素
}

###メソッドの追加
エクステンションで追加したメソッドは通常のメソッドと同様に使用できます。

次のサンプルコードでは、標準ライブラリにあるString型を拡張しています。


extension String {
    func printSelf() {
        print(self)
    }
}

let string = "abc"
string.printSelf()

実行結果
abc

###コンピューテッドプロパティの追加

エクステンションでは、ストアドプロパティは追加することができませんが、
コンピューテッドプロパティなら追加することができます。

コンピューテッドプロパティを追加すれば、
アプリケーション内で既存の型に対して頻繁に行われる処理を型自身に定義できます。

サンプルコードでは、
String型に「」(鍵括弧)で囲んだ値を返すコンピューテッドプロパティを作成しました。


extension String {
    var kakko: String {
        return "「\(self)」"
    }
}

let title = "吾輩は猫である".kakko
print(title)

実行結果
吾輩は猫である

###イニシャライザの追加

エクステンションではイニシャライザを追加することも可能です。

既存の型にイニシャライザを追加することで、
アプリケーション固有の情報から既存の型のインスタンスを生成することも可能になります。

サンプルコードでBook型を作成しました。
このBook型は、イニシャライザで本のタイトルと登場キャラを引数に指定しています。

let book1 = Book(title: "NARUTO", char: "日向ヒナタ")
既存のBook型でインスタンス化した処理になります。
(ヒナタが好きなのでヒナタにしました。サクラじゃなくてすみません。)

インスタンス化された際にヒナタはイニシャライザでプロパティcharactersに追加されました。
なのでprint(book1.characters)の結果が["日向ヒナタ"]になります。

ですが、通常のインスタンス化ではキャラクターを一人しか追加できず面倒なので、
一気に複数人のキャラクターを追加したくなると思います。

そういった場合に、エクステンションでイニシャライザを追加します。
init(title: String, charArray: [String])が新しく追加したイニシャライザです。

こちらは、既存のイニシャライザと違い、
Array<String>型、つまり、String型の配列を引数に指定しています。

なので、事前に配列を作成しそれを引数に渡します。

配列の定義
var charArray1: [String] = ["ルフィ", "ゾロ", "サンジ", "ウソップ"]

インスタンス化
let book2 = Book(title: "ONE PIECE", charArray: charArray1)

出力結果
["ルフィ", "ゾロ", "サンジ", "ウソップ"]


struct Book {
    var title: String
    var characters: [String] = []
    
    init(title: String, char: String) {
        self.title = title
        self.characters.append(char)
    }
}

extension Book {
    init(title: String, charArray: [String]) {
        self.title = title
        self.characters = charArray
    }
}

var charArray1: [String] = ["ルフィ", "ゾロ", "サンジ", "ウソップ"]
var charArray2: [String] = ["竈門炭治郎", "竈門禰豆子", "冨岡義勇", "煉󠄁獄杏寿郎"]

// 通常のイニシャライザを使用
let book1 = Book(title: "NARUTO", char: "日向ヒナタ")
//エクステンションで追加されたイニシャライザを使用
let book2 = Book(title: "ONE PIECE", charArray: charArray1)
let book3 = Book(title: "鬼滅の刃", charArray: charArray2)

print(book1.characters)
print(book2.characters)
print(book3.characters)

実行結果
["日向ヒナタ"]
["ルフィ", "ゾロ", "サンジ", "ウソップ"]
["竈門炭治郎", "竈門禰豆子", "冨岡義勇", "煉󠄁獄杏寿郎"]

以上がエクステンションの説明のなります!

すぐに思いつく簡単なエクステンションの例はこれでしたので、
あまりいい機能を実装できていませんが許してください。

後、ヒナタじゃなくてサクラファンの方も許してください・・・。

他にも、型の構成要素の記事がございますのでぜひご覧ください。

【Swift】型の構成要素〜型の基本〜
【Swift】型の構成要素〜プロパティ前編〜
【Swift】型の構成要素〜イニシャライザ〜
【Swift】型の構成要素〜メソッド〜
【Swift】型の構成要素〜サブスクリプト〜
【Swift】型の構成要素〜型のネスト〜

最後までご覧いただきありがとうございました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?