2016-10-17 5 views
12

私は両者の違いや利便性のinitの目的を理解するのに苦労しています。 ありがとう便宜的なinitとvimitの違いは何ですか?

+0

はあなたが読んだことがあり、[初期化](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

+1

SOには既に回答があります。参照してください - http://stackoverflow.com/questions/30896231/why-convenience-keyword-is-even-needed-in-swift – Santosh

答えて

17

指定イニシャライザは、クラスのプライマリイニシャライザです。 指定された初期化子は、 によって導入されたすべてのプロパティを完全に初期化し、適切なスーパークラス初期化子を呼び出して、 スーパークラスチェーンの初期化プロセスを継続します。

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を持って長い初期化子を持つカスタムビューと、このようなを作成するときに、私はこれらの多くを使用します。ドキュメントは、私ができることよりも説明がうまくいって、チェックアウトしてください!

11

コンビニエンスイニシャライザは、多くのプロパティを持つクラスを使用している場合に使用されます。このクラスは、すべての変数で常にウィットを初期化するために「痛い」ものになります。したがって、便利なイニシャライザで行うことは、オブジェクトの初期化に使用する変数の数を指定し、残りにデフォルト値を代入します。 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 
3

これは、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.

0

ノートで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

関連する問題