Class - Initialization
初期化は、各propertyの初期値を設定するためにクラス、構造体、および列挙インスタンスを使用する準備をするステップです.
以前は、宣言で簡単に初期化しただけでしたが、initコードを見たとき、少し怖かったようです.
これはいくつかのルールや順序を理解するのに良い時間です.
プロパティを宣言しながらinitではなく初期値として値を指定できます.
初期化パラメータ値と割当てをカスタマイズできます.
Propertyがオープンタイプの場合、initプロセスで値が追加されていない場合はnilが自動的に割り当てられます.
var optionalValue: Int? = これをする必要はありません
初期化中に定数プロシージャに値を割り当てることができます.
すべての初期値はに設定されています. カスタムイニシエータなし
上記の場合、SWIFTはデフォルトのイニシエータを自動的に提供し、初期化を簡略化することができる.
イニシャルタイプライターから他のイニシャルタイプライターを呼び出します.
すぐに値を割り当てて初期化します.
以下に示すことができる.
クラスには継承関係があり、SuperClassとの関係が少し複雑になっています.
これからinitのルールは?同じ内容.つまらないけど、理解して理解すればいい.
すべてのクラスのpropertyとスーパークラスのすべてのpropertyは、初期に値を設定し、2つの方法を提供する必要があります.(クラス内のinit間のルール) Designated Initializers and Convenience Initializers Designed Initializersは、すべてのPropertiesを初期化するためのクラスの頭文字の略語中断の主な構文です.クラスには少なくとも1つの設計イニシエータが必要です. 「イニシエータを容易にする」は、予め指定された値を使用して初期化され、最小限の入力で初期化できます.便利な起動者は、他のイニシエータを呼び出す必要があります. Initializer Delegation for Class Types
設計イニシエータと構成イニシエータの間の委任関係を簡略化するには、次の3つのルールがあります. 設計初期化器は、スーパークラスの設計初期化器を初期化しなければならない. イニシエータは、他のイニシエータを呼び出す必要があります. イニシエータは、最終的に設計イニシエータを呼び出す必要がある. 絵は複雑ですが、文字を理解していれば見やすいです.
デュアルフェーズ初期化(init内部のルール)
SWIFTでは、初期化は2つのステップで行われる. ステップ1
呼び出し初期化器 サブクラスのすべてのプロパティを初期化し、スーパークラス初期化 を行う.の最上位レベルのすべてのプロパティ値を確認し、 の初期化を完了します.
ステップ2トップクラスのinitが終了してからselfを有効にします. 以降のサブクラスの指定init 以降は、便利なinit順でサブクラス を使用することができる.
swiftは、上記の2つのプロセスのセキュリティを確保するための4つのルールを提供します.ルールを守らないとコンパイルエラーが発生します Designated initは、現在のクラスのpropertyを指定する必要があります. 設計のinitは、継承されたpropertyに割り当てる前にスーパークラスinit が必要である. Convenence initは、すべてのPropertyに割り当てる前に他の初期化器を実行する必要があります.(2番目のルールと同様の親initを使用) ステップ1のプロセスの前に、任意の方法またはpropertyにアクセスすることによって取得することはできない. Initializer Inheritance and Overriding
デフォルトでは、sub-classはsuper-class initを継承しません.
継承関係が複雑になったときにエラーの初期化を防止します. 安全かつ特定の場合にはオーバーシュートが可能であり、以下の例では可能である.
Propagation of Initialization Failure
init? に示すように、実装は失敗する可能性のあるイニシエータとなり、nilに戻ることができます.
Overriding a Failable Initializer
失敗する可能性のあるプロモーターを上書きし、失敗しないプロモーターにします.
init!
失敗する可能性のあるイニシエータを強制的にアンインストールすることで、上書きすることもできます.
すべてのサブクラスで実装する必要がある初期サブクラスについては、次の必須キーワードを使用して実装できます.
}
}
コメントに書くともっと良い投稿で修正されます
以前は、宣言で簡単に初期化しただけでしたが、initコードを見たとき、少し怖かったようです.
これはいくつかのルールや順序を理解するのに良い時間です.
Syntax
class SomeClass {
init() {
}
}
Default Property Values
プロパティを宣言しながらinitではなく初期値として値を指定できます.
struct SomeStruct {
var someProperty = 32.0
//구현하지 않아도 됨
init(property: Double) {
self.someProperty = property
}
}
Customizing initialization
初期化パラメータ値と割当てをカスタマイズできます.
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius is 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
Optional Property types
Propertyがオープンタイプの場合、initプロセスで値が追加されていない場合はnilが自動的に割り当てられます.
var optionalValue: Int? = これをする必要はありません
Assigning Constants Properties During Initialization
初期化中に定数プロシージャに値を割り当てることができます.
class SurveyQuestion {
let text: String
var response: String?
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}
let beetsQuestion = SurveyQuestion(text: "How about beets?")
beetsQuestion.ask()
// Prints "How about beets?"
Default Initializers(class/struct)
すべての初期値は
上記の場合、SWIFTはデフォルトのイニシエータを自動的に提供し、初期化を簡略化することができる.
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
Initializer Delegation for Value Types
イニシャルタイプライターから他のイニシャルタイプライターを呼び出します.
すぐに値を割り当てて初期化します.
以下に示すことができる.
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
//아래의 self.init은 origin과 size의 할당을 위임한다는 의미
//말이 어려워서 그렇지만... 그냥 다른 init 호출해서 쓰는게 가능하다는 걸로 이해
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
size: Size(width: 3.0, height: 3.0))
Class Inheritance and Initialization
クラスには継承関係があり、SuperClassとの関係が少し複雑になっています.
これからinitのルールは?同じ内容.つまらないけど、理解して理解すればいい.
すべてのクラスのpropertyとスーパークラスのすべてのpropertyは、初期に値を設定し、2つの方法を提供する必要があります.(クラス内のinit間のルール)
//Designated Initializer
init(params) {
//초기화
}
//Convenience Initializer
convenience init(params) {
//초기화
}
設計イニシエータと構成イニシエータの間の委任関係を簡略化するには、次の3つのルールがあります.
SWIFTでは、初期化は2つのステップで行われる.
呼び出し
ステップ2
swiftは、上記の2つのプロセスのセキュリティを確保するための4つのルールを提供します.ルールを守らないとコンパイルエラーが発生します
デフォルトでは、sub-classはsuper-class initを継承しません.
継承関係が複雑になったときにエラーの初期化を防止します.
class Vehicle {
var numberOfWheels = 0
var description: String {
return "\(numberOfWheels) wheel(s)"
}
//정의 시점에 모든 프로퍼티가 할당될 값이 지정된다면 자동 initializer가 생성된다.
}
class Bicycle: Vehicle {
override init() {
super.init()
numberOfWheels = 2
}
}
let bicycle = Bicycle()
Failable Initializers
Propagation of Initialization Failure
init? に示すように、実装は失敗する可能性のあるイニシエータとなり、nilに戻ることができます.
Overriding a Failable Initializer
失敗する可能性のあるプロモーターを上書きし、失敗しないプロモーターにします.
class Document {
var name: String?
// this initializer creates a document with a nil name value
init() {}
// this initializer creates a document with a nonempty name value
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
class AutomaticallyNamedDocument: Document {
override init() {
super.init()
self.name = "[Untitled]"
}
override init(name: String) {
super.init()
if name.isEmpty {
self.name = "[Untitled]"
} else {
self.name = name
}
}
}
init!
失敗する可能性のあるイニシエータを強制的にアンインストールすることで、上書きすることもできます.
```
class UntitledDocument: Document {
override init() {
super.init(name: "[Untitled]")!
}
}
```
Required Initializers
すべてのサブクラスで実装する必要がある初期サブクラスについては、次の必須キーワードを使用して実装できます.
```
class SomeClass {
required init() {
//initializer implementation goes here}
}
```
#学習内容に誤りがある可能性があります.コメントに書くともっと良い投稿で修正されます
Reference
この問題について(Class - Initialization), 我々は、より多くの情報をここで見つけました https://velog.io/@elile-e/Class-Initializationテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol