一見するとstructとclass似ているように見えますが、どの様なものを使うべきかを決定する時には、理解しなければならない違う点があります。
今度の章には、structをどうやって宣言すると使用するかを説明して、stuctとclassの違う点について調べます。また、value typeとreference typeに関する概念を説明します。
十二・壱 struct{}
と Class{}
は似ている
structも Class{}
みたいなObject
様な機能を使えます。
例え、機能を再利用するObject
でカプスルか方法を提供し、
Struct
宣言は Class{}
と似ていますが、使うkeyword
が違います。
let = Instance(:)
生成も同じです。意外にも拡張や : Protocol
採択や{init{}}
する事ができます。まず、valueTypeとrefereceTypeについてしてみよう。
十二・弐 Sturct
弐・甲 Class{}
とStruct{}
のInstance
Value Type
Struct{}
のInstance
はValueType
ですけど、
Class{}
のInstance
は<<Reference<<
Type`です。
弐・乙 StructInstance
のValueType
Struct Instance
がコピーされたり、Method()
に伝達する時に、Instance
の実際コピが生成されながら原本のObject
が持っているデータをこぴして取ります。つまり、copy本を別個の自身のデータを持つといす事です
実際に実行中アフリのStruct Instance
に対するCopyが複数存在することができ、それぞれのCopyは自身のデータを持って一つのInstance
を変更しても他のInstance
には影響与えない。
弐・丙 StructInstance
のValueType
これと逆に、Instance
がcopy
されるとかArgument
で伝達されると該当Class Instance(){ }
があるメモリの位置に対する<<Reference<<
が作られるとか伝達されます。
<<Reference<<
を変更すれば原本Instance
にもをなじTask
が実行されます。
つまり、ただ一つのClass Instance(){ }
が存在して、そのInstance
を指す色んな<<Reference<<
が存在する事です。
<<Reference<<
の一つを使えてInstanceData
を変更すると全てのデータが変更されます。
弐・丁 例題
弐・戊 Class{}
はできますけど、Struct{}
ができない事と
Struct{}
はsubClass{}
とかinherit
をサポートしません
言い直して、他のStruct{}
でinherit
できません。
他にも、{deinit{}}
を含まる事ができません。
最後に、Run Time
で Class Instance(){ }
のType
を識別することができますが Struct{}
そうではありません。
弐・己 Struct{}
と Class{}
はいつ使いますか
一般的にStruct{}
が Class{}
より効率的し、MultiThreadコードを使用するともっと安定的で、できればStruct
使用を進めます。
だが↓inherit
が必要とか、テータがカプスル化された一つのInstance
が必要な時には Class
を使用するべきです。
最後に、Instance
が消滅するときリソースを確保する為の Class
を使う。
十二・参 Enum
参・甲 enumについて
? enumerate : mention (a number of things) one by one.
~ Latin enumerat- ‘counted out’, from the verb enumerare,
此れは、事前定義されたvalue =
の集合で構成された使用者指定データターフを作るのに使用されます。
Enumeration
は一般的に'Switch
Syntaxを使用する時にも使います。
enum Temperature {
case hot
case warm
case cold
}
value
が割り当てない場合いそのタープのenum{}
は基本的に先に定義された状態の一つを参照するために使用されます。
func displayTempInfo(temp: Temperature) {
switch temp {
case .hot:
print("It is hot")
case .warm:
print("It is warm")
case .cold:
print("It is cold")
}
}
enumには有効するmemberの最終集合があるのでSwitchSyntax
にdeault
を含める必要がないことです。
SwitchSyntax
をとして有効できない enum{}case
を伝達すればRunTimeError
が起こる可能性がある前にCompiler
によって捕捉される。
enum{}
をテストすると、次の3つが可能な状態中の1つが選ばれたTemperatrueのenum{}
のInstance
をdisplayTempInfofunc(){ }
に伝達するべきだ
Temperature.hot // instance
Temperature.warm// instance
Temperature.cold// instance
displayTempInfo(temp: Temperature.warm) //run
>> It is warm
enum{}
内の個別のcaseには接続されたvalue =
があるかも知れない
例え、coldのenum{}Case
が tempと接続されなければappが寒さと凍結を区別できるとしましょう。此れは次の様にenum{}
宣言内で定義できます。
enum Temperature {
case hot
case warm
case cold(centigrade: Int)
}
これを通じて、Switch
Syntax
は次の様にcold
caseのTemperatureも確認できます。
func displayTempInfo(temp: Temperature) {
switch temp {
case .hot:
print("It is hot")
case .warm:
print("It is warm")
case .cold(let centigrade) where centigrade <= 0:
print("Ice warning: \(centigrade) degrees.")
case .cold:
print("It is cold but not freezing")
}
}
displayTempInfo(temp: Temperature.cold(centigrade: -10))
>> Ice warning: -10 degrees
要約
Swift Struct{}
と Class{}
は{Property = }
を定義して、value
を保存します。{method()}
を定義できる(Object: )
生成メカニズムを提供します。二つのメカニズムが似たいる様ですけど、StructInstance
とClassInstance
がcopy
されるとか伝達する時には大事な違う点を見せます。
Class
は<<reference<<
:Type
:Object
で具別されるですけど、
Struct
はvalue =
:Type
で具別されます。
struct{Instance{}}
がcopy
されるとか{method()}
で伝達されば元々の Class{Instance{}}
を指す<<reference<<
ができます。
Class{}
だけが持つ固有の機能はinheritとdeinitを支援することで、Runtimeで Class{}
Typeを識別できることです。
enum{}
は前に定義されたcase:
value
集合で構成された使用者指定タイプを作るために使用されて、特にSwitch Syntax
内でCase
を識別する為に使用されます。