私は両者の違いや利便性のinitの目的を理解するのに苦労しています。 ありがとう便宜的なinitとvimitの違いは何ですか?
答えて
:
指定イニシャライザは、クラスのプライマリイニシャライザです。 指定された初期化子は、 によって導入されたすべてのプロパティを完全に初期化し、適切なスーパークラス初期化子を呼び出して、 スーパークラスチェーンの初期化プロセスを継続します。
convenience init
:
簡易イニシャライザは クラスのイニシャライザを支持する、二次的です。便利な初期化子を定義して、 初期化子を簡易初期化子と同じクラスから呼び出すことができます。 の指定された初期化子のパラメータをデフォルト値に設定します。 は、特定のユースケースまたは入力値タイプに対して、そのクラス のインスタンスを作成するための便利な初期化子を定義することもできます。 Swift Documentation
あたりとして
は基本的に、これは一言で言えば意味すべては、あなたがより速く、より「便利」指定イニシャライザを呼び出す作るために便利な初期化子を使用することです。したがって、便利なイニシャライザでは、self.init
の代わりに、指定されたイニシャライザのオーバーライドで表示されるsuper.init
の代わりに使用する必要があります。
擬似コード例:
init(param1, param2, param3, ... , paramN) {
// code
}
// can call this initializer and only enter one parameter,
// set the rest as defaults
convenience init(myParamN) {
self.init(defaultParam1, defaultParam2, defaultParam3, ... , myParamN)
}
主deafultsを持って長い初期化子を持つカスタムビューと、このようなを作成するときに、私はこれらの多くを使用します。ドキュメントは、私ができることよりも説明がうまくいって、チェックアウトしてください!
コンビニエンスイニシャライザは、多くのプロパティを持つクラスを使用している場合に使用されます。このクラスは、すべての変数で常にウィットを初期化するために「痛い」ものになります。したがって、便利なイニシャライザで行うことは、オブジェクトの初期化に使用する変数の数を指定し、残りにデフォルト値を代入します。 Ray Wenderlichのウェブサイトには非常に良いビデオがあります。私は有料アカウントを持っているため、無料であるかどうかはわかりません。 ここでは、すべての変数を使ってオブジェクトを初期化するのではなく、単にタイトルを付けることができます。標準init
struct Scene {
var minutes = 0
}
class Movie {
var title: String
var author: String
var date: Int
var scenes: [Scene]
init(title: String, author: String, date: Int) {
self.title = title
self.author = author
self.date = date
scenes = [Scene]()
}
convenience init(title:String) {
self.init(title:title, author: "Unknown", date:2016)
}
func addPage(page: Scene) {
scenes.append(page)
}
}
var myMovie = Movie(title: "my title") // Using convenicence initializer
var otherMovie = Movie(title: "My Title", author: "My Author", date: 12) // Using a long normal initializer
これは、Apple Developer portalから取られた単純な例です。
指定された初期化子は、基本的にinit(name: String)
であり、すべての格納されたプロパティが初期化されることを保証します。
init()
簡略初期化子は引数なしで、指定された初期化子を使用してname
格納プロパティの値を[Unnamed]
に自動的に設定します。
class Food {
let name: String
// MARK: - designated initializer
init(name: String) {
self.name = name
}
// MARK: - convenience initializer
convenience init() {
self.init(name: "[Unnamed]")
}
}
// MARK: - Examples
let food = Food(name: "Cheese")
let food = Food()
大規模なクラスを扱う場合、少なくともいくつかの格納プロパティを使用すると便利です。私はApple Developer portal.
ノートでoptionalsと継承に関するいくつかの詳細を読むことをお勧めします:
指定初期化子は、クラスの主な初期化子です全体のテキストをお読みください。指定されたイニシャライザは、そのクラスによって導入されたすべてのプロパティを完全に初期化し、適切なスーパークラスイニシャライザを呼び出して、スーパークラスチェーンまでの初期化プロセスを継続します。
便利初期化子は、クラスの初期化子をサポートする副式です。指定されたイニシャライザのパラメータのいくつかをデフォルトに設定して、便利なイニシャライザを定義して、便利なイニシャライザと同じクラスから指定されたイニシャライザを呼び出すことができます。クラスのための
指定初期化子が値型の場合と、単純な初期化子同じように書かれている:
init(parameters) {
statements
}
コンビニ初期化子は、同じスタイルで書かれていますが、利便性改質剤とのinitキーワードの前に置かれ、区切られ空間:
convenience init(parameters) {
statements
}
実用的な例は以下の通りである:
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[Unnamed]")
}
}
let namedMeat = Food(name: "Bacon")
// namedMeat's name is "Bacon”
Foodクラスのinit(name:String)初期化子は、指定された初期化子として提供されます。これは、新しいFoodインスタンスのすべての格納プロパティが完全に初期化されることを保証するためです。 Foodクラスにはスーパークラスがないため、init(name:String)イニシャライザは初期化を完了するためにsuper.init()を呼び出す必要はありません。
"Foodクラスは、引数なしで便利な初期化子init()も提供します。 init()初期化子は、食品クラスのinitに渡って委譲することで、新たな食品のデフォルトのプレースホルダ名を提供しますの名前の値を持つ(名前文字列)[名前]:」
“let mysteryMeat = Food()
// mysteryMeat's name is "[Unnamed]”
階層内の第二のクラスRecipeIngredientと呼ばれるFoodのサブクラスです。 RecipeIngredientクラスは、料理レシピの成分をモデル化します。 、文字列:
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
RecipeIngredientクラスは、単一の指定イニシャライザを有し、INIT(名称:これはとRecipeIngredientインスタンスを作成するための2つの初期化子を定義(それは食品から継承Nameプロパティに加えて)量と呼ばれるのIntプロパティを紹介しますquantity:Int)を使用して、新しいRecipeIngredientインスタンスのすべてのプロパティを設定できます。この初期化子は、quantityプロパティに渡されたquantity引数を割り当てることによって開始します。これは、RecipeIngredientによって導入された唯一の新しいプロパティです。その後、初期化子は、Foodクラスのinit(name:String)初期化子に委譲します。
ページ:から536抜粋:「スウィフトプログラミング言語(スウィフト4)」されたApple Inc.のiBook。 https://itunes.apple.com/pk/book/the-swift-programming-language-swift-4-0-3/id881256329?mt=11
- 1. window.onload = init();の違いは何ですか?およびwindow.onload = init;
- 2. iOSの[Class new]と[[Class alloc] init]の違いは何ですか?
- 3. init()とwindow.init()の違いは何ですか?
- 4. 便宜上Spriteクラスを拡張していますか?
- 5. init()とinit(_:bool)の違い
- 6. ネストされた明示的な定義が議論の便宜上
- 7. UpdatePanelと「伝統的な」AJAXとの違いは何ですか?
- 8. オーバーライドinitと必要なinitの違いは? - swift
- 9. setとdidSetの基本的な違いは何ですか?
- 10. PUTとPOSTの技術的な違いは何ですか?
- 11. ToString()とConvert.ToString()の基本的な違いは何ですか?
- 12. jobconfとjobの基本的な違いは何ですか?
- 13. FlyweightとSingletonパターンの実用的な違いは何ですか?
- 14. Zend Framework:戻り値がないとブートストラップのinitでリソースインスタンスを返すことの違いは何ですか?
- 15. RavenDbでは、ジェネリックセッションで便宜的に使用される静的インデックスがあります。クエリ<TDocType>
- 16. 便宜のために利用可能なイニシャライザは失敗します
- 17. 具体的なRTNと抽象的なRTNの違いは何ですか?
- 18. 静的ブロックと静的フィールドの違いは何ですか?
- 19. 静的SQLと動的SQLの違いは何ですか?
- 20. ExtJS 6 GPLと商業的な違いは何ですか?
- 21. ヘルパーと部分的な違いは何ですか?
- 22. 便宜のためにJWTペイロードに公開鍵を持たない理由
- 23. 静的バインディングと動的バインディング - 違いは何ですか?
- 24. .vagrantと.vagrant.dディレクトリの論理的/概念的な違いは何ですか?
- 25. Sencha Touch 2 - initとは何ですか?
- 26. cfn-initとSSMの違いは?
- 27. golangの便宜のために変数を再宣言しますか?
- 28. Djangoの静的ファイルとメディアファイルの違いは何ですか?
- 29. エスプレッソの意図と目的の違いは何ですか?
- 30. Djangoのテンプレートインクルードと静的インクルードの違いは何ですか?
はあなたが読んだことがあり、[初期化](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18- ID203)セクション(https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics)を参照してください。html#// apple_ref/doc/uid/TP40014097-CH5-ID309)book?あなたの混乱は何ですか? – rmaddy
SOには既に回答があります。参照してください - http://stackoverflow.com/questions/30896231/why-convenience-keyword-is-even-needed-in-swift – Santosh