8
4

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.

プロトコルとクラスと構造体の違いをざっくり理解しよう!

Posted at

今回は、,プロトコル、クラス、構造体の違いについて学習したので、アウトプットしていきます
※以下の内容は、学習内容のアウトプット用のため、誤りがある場合があります。予めご了承ください

#プロトコルとは?
プロトコル(protocol)とは、直訳すると「条約」、「議定書」、「規約」のような意味になります。
Swiftの言語においては「開発者とSwift言語との約束ごと」を意味します.

まずは、宣言の書き方を見ていきましょう。

qiita.rbvar
protocol <プロトコル名> {
}

基本的にこのような形で宣言します。classとの違いは、「class」というキーワードが「protocol」になっただけです。
では、さらに深堀りしていきましょう。

#プロトコルでのメソッド
ここからが、プロトコルとクラスの明確な違いですが、プロトコルではメソッドを書く時メソッドの中身を書きません。
書き方は以下のようになります。

qiita.rbvar
protocol <プロトコル名> {
     func<メソッド名>()
}

一見、クラスと似た書式ですが、メソッド名()の後に{}がありません!

#プロトコルの使い方
プロトコルはメソッドの中身を書かないということは、宣言しただけでは意味がないということです。

では、どのように使用する深堀していきましょう。
基本的には、プロトコルは「クラス」とセットで使います。

qiita.rbvar
class <クラス名> <プロトコル名> {
 }

クラス宣言の「:」の後にプロトコル名を書きます。
このように、クラスにプロトコルが参加する書き方を批准といいます.
プロトコルを批准した場合は、そのプロトコルに定義されているメソッドを実装する必要あります。実装されなければエラーになります。

次に具体的に見ていきましょう。

qiita.rbvar
protocol MorningProtocol {
     func morningAction()
}
qiita.rbvar
class Date:MorningProtocol {
  func morningAction(){
  print("朝ごはんを食べます")
  print("歯を磨きます")
}

上記では、朝起きた後にすることをデバックエリアに出力しています。これがプロトコルの最も基本的な使い方です

#型としてのプロトコル
プロトコルには型としての機能があります。変数名を宣言する際に、変数名の後ろに「:」を付けてプロトコル名を指定すると、その変数はそのプロトコルを批准しているクラス専用の箱になります。

qiita.rbvar
var <変数名>:<プロトコル名> = <クラス名> ()

#クラスとは?
クラスはテンプレートとして解釈されています。クラスは、たい焼きを作る時の金型をイメージしてくださいとよく例として用いられます。

クラスの宣言は以下の通りです。

qiita.rbvar
class <クラス名> ()

#クラスにおけるメソッドの宣言
宣言方法は以下通りです

qiita.rbvar
class <クラス名> {
  func<メソッド名>(){}

}

次は具体的に宣言していきましょう

qiita.rbvar
class Hamburger {
   var nakami = "パティ"

 func sayNakami () {
 print("中身は"+nakami+"です") //中身はパティです
}

では、実際にクラスを上記で作成したクラスを使用して見ましょう。

qiita.rbvar
var hamburger = Hamburger()
hamburger.nakami = "パティとチーズ"
hamburger.sayNakami() //中身はパティとチーズです。

上記の例では、クラスを元にして、インスタンスを作り、インスタンスを操作して処理実行しています。
nakamiプロパティの値にチーズを加え、文字列を変更しています。

#構造体とは?
クラス、プロトコルとの違いを一言で言えば、
継承できないクラスのことです!

基本的な書き方は以下の通りです。

qiita.rbvar
struct 構造体名 {
   var プロパティ名プロパティの型 = 
   let プロパティ名プロパティの型 = 
}

次は具体的な例を見ていきましょう

qiita.rbvar
struct SomeStruct {
   var num1 = 246
   let num2 = 135
}

let someStruct = SomeStruct()
let a = someStruct.num1 //246
let b = someStruct.num2 //135

#構造体とクラスの違いを深堀する
上記では、クラスと構造体の違いは継承できるかできないかの違いかと書きましたが、ここでは、具体例を見ていきましょう。

qiita.rbvar
// 構造体(値型)
struct ColorStruct {
    var color:String
}

// クラス(参照型)
class ColorClass {
    var color:String

    init(color:String){
        self.color = color
    }
}

var colorStruct1 = ColorStruct(color: "青")
var colorStruct2 = colorStruct1
colorStruct2.color = "黒"
println("colorStruct1:\(colorStruct1.color)、colorStruct2:\(colorStruct2.color)")

出力結果 構造体の場合はcolorStruct2.colorを変更してもcolorStruct1は変更しない
"colorStruct1:青, colorStruct1:黒"


var colorClass1 = ColorClass(color: "青")
var colorClass2 = colorClass1
cardClass2.color = "黒"
println("colorClass1:\(colorClass1.color)、colorClass2:\(colorClass2.color)")


出力結果 構造体の場合はcolorClass2.colorを変更したらcolorClass1も変更される
"colorClass1:黒, colorClass2:黒"

上記のように、構造体は継承されることなく、一つずつ独立した概念を持っていることが分かります。

#まとめ
今回は学習していると、プロトコルとクラスと構造体の違いは...「あれ?、どうだったっけ?」となることが多かったのでざっくりまとめてみました!

8
4
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
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?