init
:
init() {
// выполнить здесь некую инициализацию
}
Fahrenheit
для хранения температуры, выраженной в шкале Фаренгейта. Структура Fahrenheit
имеет одно хранимое свойство, temperature
, типа Double
:
struct Fahrenheit {
var temperature: Double
init() {
temperature = 32.0
}
}
var f = Fahrenheit()
print("The default temperature is \(f.temperature)° Fahrenheit")
// Выводит "The default temperature is 32.0° Fahrenheit"
Структура определяет единственный конструктор, init
, без параметров, который инициализирует хранимое значение температуры значением 32.0 (точка замерзания воды в градусах Фаренгейта).
Fahrenheit
из примера выше в более простой форме, предоставив значение по-умолчанию для её свойства temperature
в точке его объявления:
struct Fahrenheit {
var temperature = 32.0
}
Celsius
, которая хранит температуру, выраженную в градусах Цельсия. Структура Celsius
реализует два кастомных инициализатора с названиями init(fromFahrenheit:)
и init(fromKelvin:)
, которые создают новый объект структуры со значениями в разных температурных шкалах:
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 теперь равен 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius теперь равен 0.0
Первый конструктор имеет один параметр инициализации с ярлыком аргумента fromFahrenheit
и именем параметра fahrenheit
. Второй инициализатор имеет единственный параметр с ярлыком аргумента fromKelvin
и именем параметра kelvin
. Оба инициализатора конвертируют их единственный аргумент в корреспондирующее значение в Цельсиях и сохраняют это значение в свойстве temperatureInCelsius
.
Color
с тремя константными свойствами с названиями red
, green
и blue
. Эти свойства хранят значения между 0.0 и 1.0 для индикации количества красного, зелёного и голубого цветов в цвете.
Color
предоставляет конструктор с тремя соответствующе названными параметрами типа Double
для его красной, зеленой и голубой компонент. Color
также предоставляет второй инициализатор с единственным параметром white
, который используется для предоставления одного значения для всех трёх компонент.
struct Color {
let red, green, blue: Double
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
init(white: Double) {
red = white
green = white
blue = white
}
}
Color
путём предоставления значений для каждого параметра:
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
let halfGray = Color(white: 0.5)
let veryGreen = Color(0.0, 1.0, 0.0)
// это вызовет ошибку времени компиляции - ярлыки аргументов необходимы
Celsius
с дополнительным конструктором для создания нового объекта типа Celcius
из значения типа Double
, уже приведённого к шкале Цельсия:
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
init(_ celsius: Double) {
temperatureInCelsius = celsius
}
}
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius теперь равен 37.0
Вызов конструктора Celsius(37.0)
определённо не требует указания ярлыка аргумента. Так что этот инициализатор в виде init(_ celsius: Double)
, так чтобы его можно было вызвать путём предоставления безымянного значения типа Double
.
nil
, что означает, что свойство имеет "значения пока нет" в процессе инициализации.
SurveyQuestion
с опциональным типом String
у свойства response:
class SurveyQuestion {
var text: String
var response: String?
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}
let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// Выведет "Do you like cheese?"
cheeseQuestion.response = "Yes, I do like cheese."
Ответ на вопрос опроса не может быть известен прежде, чем будет задан вопрос, так что свойство response
объявлено с типом String?
или "опциональная String". Ему автоматически присваивается значение по-умолчанию nil
, означающее "здесь ещё нет строки", когда объект типа SurveyQuestion
инициализируется.
SurveyQuestion
выше для использования константного свойства вместо переменного для свойства text
, чтобы определить то, что вопрос не может быть изменён, как только объект типа SurveyQuestion
создан. И хотя свойство text
теперь постоянно, оно всё ещё может быть задано через инициализатор класса:
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()
// Выведет "How about beets?"
beetsQuestion.response = "I also like beets. But not with cheese."
ShoppingListItem
, который инкапсулирует имя, количество и статус покупки вещи в листе товаров:
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
Так как все свойства класса ShoppingListItem
имеют значения по-умолчанию, а также так как это класс является базовым, то ShoppingListItem
автоматически получает реализацию конструктора по-умолчанию, которая создаёт новый объект со всеми его свойствами, заданными в значения по-умолчанию. (Свойство name
имеет тип String?
, так что оно автоматически получает дефолтное значение nil
, даже если никакого значения не будет записано в коде.) Пример выше использует дефолтный конструктор для класса ShoppingListItem
для создания нового объекта для класса с синтаксисом инициализатора, записываемого как ShoppingListItem()
и присваивает его новой переменной item
.
Size
с двумя параметрами width
и height
. Оба свойства выведены в тип Double
ввиду наличия у них дефолтных значений 0.0.
Size
автоматически получает почленный конструктор init(width:height:)
, который Вы можете использовать для создания нового объекта типа Size
:
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)