Swift не может использовать автоматический memberwise initializers для классов, по двум причинам:
-
Теряется возможно прописывать более удобную инициализацию (Н/р: convenience init) для child классов. У компилятора нет возможности самостоятельно выстроить цепочку инициализации;
-
Память у классов выделяется динамически во время запуска приложения, поэтому свифт заранее не может выделить необходимую память под него;
-
designated init == init - дефолтный;
-
convenience init;
-
required init - для протоколов;
Точка инициализации, которая обязательно должна удовлетворить потребности класс (передать ему все параметры), продолжается вверх по цепочке суперклассов (вызывает соответствующий инициализатор суперкласса). Каждый класс должен иметь по крайней мере один назначенный инициализатор.
Можно принять меньше параметров и вызвать designated init, который закончит работу инициализации класса.
Может вызывать другой convenience init или designated init, но не инициализацию суперкласса.
let str = "5"
let num = Int(str)
print(num) // Optional(5)
У нас num: String? = Optional(5)
, потому что str может быть не 5, тогда будет равен num = nil
. Можно самостоятельно написать такой инициализатор, используя init?()
init в структурах
Без init() нам обязательно нужно указывать при создании экземпляра структура нужно обязательно указать имя.
struct User {
var username: String
// membership initializing
}
var user = User(username: "twostraws")
С init() нам не обязательно указывать имя, это называется custom initializer:
struct User {
var username: String
init() {
username = "Anonymous"
print("Creating an anonymous employee…")
}
}
// Не работает!!!
// var user = User(username: "twostraws")
// Работает:
var user = User()
user.username = "twostraws"
Также можно использовать memberwise initializers:
struct User {
var name: String = "Anonymous"
var yearsActive = 0
}
var user = User(name: "Alan", yearsActive: 32)