サーチ…


デフォルトのプロパティ値の設定

イニシャライザを使用して、デフォルトのプロパティ値を設定できます。

struct Example {
    var upvotes: Int
    init() {
        upvotes = 42
    }
}
let myExample = Example() // call the initializer
print(myExample.upvotes) // prints: 42

または、プロパティの宣言の一部としてデフォルトのプロパティ値を指定します。

struct Example {
    var upvotes = 42 // the type 'Int' is inferred here
}

クラスと構造体 、インスタンスが作成されるまでに、すべての格納されたプロパティを適切な初期値に設定する必要があります。この例はコンパイルされません。なぜなら、イニシャライザがdownvotes初期値を与えなかったからdownvotes

struct Example {
    var upvotes: Int
    var downvotes: Int
    init() {
         upvotes = 0
    } // error: Return from initializer without initializing all stored properties
}

パラメタによる初期化のカスタマイズ

struct MetricDistance {
    var distanceInMeters: Double

    init(fromCentimeters centimeters: Double) {
        distanceInMeters = centimeters / 100
    }
    init(fromKilometers kilos: Double) {
        distanceInMeters = kilos * 1000
    }
}

let myDistance = MetricDistance(fromCentimeters: 42)
// myDistance.distanceInMeters is 0.42
let myOtherDistance = MetricDistance(fromKilometers: 42)
// myOtherDistance.distanceInMeters is 42000

パラメータラベルを省略することはできません。

let myBadDistance = MetricDistance(42) // error: argument labels do not match any available overloads

パラメータラベルの省略を許可するには、ラベルとしてアンダースコア_を使用します。

struct MetricDistance {
    var distanceInMeters: Double
    init(_ meters: Double) {
        distanceInMeters = meters
    }
}
let myDistance = MetricDistance(42) // distanceInMeters = 42

引数のラベルが1つ以上のプロパティと名前を共有する場合は、 selfを使用してプロパティ値を明示的に設定します。

struct Color {
    var red, green, blue: Double
    init(red: Double, green: Double, blue: Double) {
        self.red = red
        self.green = green
        self.blue = blue
    }
}

便利なinit

スウィフトクラスは、複数の初期化方法をサポートしています。 Appleの仕様に従えば、この3つのルールは尊重されなければなりません:

  1. 指定されたイニシャライザは、その直属のスーパークラスから指定されたイニシャライザを呼び出さなければならない最初のルール
  2. 便利な初期化子は、同じクラスの別の初期化子を呼び出さなければなりません。
  3. 便利なイニシャライザは、最終的に指定されたイニシャライザを呼び出さなければなりません。 2番目と3番目のルール
class Foo {

    var someString: String
    var someValue: Int
    var someBool: Bool

    // Designated Initializer
    init(someString: String, someValue: Int, someBool: Bool)
    {
        self.someString = someString
        self.someValue = someValue
        self.someBool = someBool
    }

    // A convenience initializer must call another initializer from the same class.
    convenience init()
    {
        self.init(otherString: "")
    }
    
    // A convenience initializer must ultimately call a designated initializer.
convenience init(otherString: String)
    {
        self.init(someString: otherString, someValue:  0, someBool: false)
    }
}


class Baz: Foo
{
    var someFloat: Float
    
    // Designed initializer
    init(someFloat: Float)
    {
        self.someFloat = someFloat
        
        // A designated initializer must call a designated initializer from its immediate superclass.
        super.init(someString: "", someValue: 0, someBool: false)
    }
    
    // A convenience initializer must call another initializer from the same class.
    convenience init()
    {
        self.init(someFloat: 0)
    }
}

指定された初期化子

let c = Foo(someString: "Some string", someValue: 10, someBool: true)

利便性init()

let a = Foo()

便利なinit(otherString:String)

let b = Foo(otherString: "Some string")

指定された初期化子(スーパークラス指定初期化子を呼び出す)

let d = Baz(someFloat: 3)

利便性init()

let e = Baz()

画像ソース: Swift Programming Languag e

Throwable Initilizer

エラー処理を使用して構造化(またはクラス)初期化子をスロー可能な初期化子として作成する:

列挙型エラーの例:

enum ValidationError: Error {
    case invalid
}

エラー処理の列挙型を使用して、Struct(またはクラス)のパラメータが期待される要件を満たしているかどうかをチェックできます

struct User {
    let name: String

    init(name: String?) throws {

        guard let name = name else { 
           ValidationError.invalid
        }

        self.name = name
    }
}

今度は、スロー可能なイニシャライザを次のように使用できます。

do {
   let user = try User(name: "Sample name")
            
   // success
}
catch ValidationError.invalid {
     // handle error
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow