Поиск…


Установка значений свойств по умолчанию

Вы можете использовать инициализатор для установки значений свойств по умолчанию:

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 :

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

Если ваши метки аргументов обмениваются именами с одним или несколькими свойствами, используйте self чтобы явно установить значения свойств:

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

Удобство инициализации

Классы Swift поддерживают несколько способов инициализации. Следуя спецификациям Apple, эти 3 правила должны соблюдаться:

  1. Назначенный инициализатор должен вызывать назначенный инициализатор из своего непосредственного суперкласса. Для первого правила
  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

Хирургический Инициализатор

Использование обработки ошибок, чтобы сделать инициализатор Struct (или class) в качестве запускаемого инициализатора:

Пример Обработка ошибок:

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