-
Notifications
You must be signed in to change notification settings - Fork 2
Enumeration, Extention
Если мы устанавливаем raw value type как Int, то Swift автоматически пронумерует case spades = 0, case hearts = 1, case diamonds = 2, case clubs = 3
enum Suit: Int {
case spades
case hearts
case diamonds
case clubs
}
Если мы устанавливаем raw value type как String, то Swift автоматически пронумерует case spades = "spades", case hearts = "hearts", case diamonds = "diamonds", case clubs = "clubs"
enum Suit: String {
case spades
case hearts
case diamonds
case clubs
}
С помощью CaseIterable
протокола легко выполнить итерации по перечислению или получить общее количество наблюдений. Swift предоставляет коллекцию всех случаев как свойство .allCases
типа перечисления, что дает возможность использовать функциональные методы: forEach
, filter
, и map
.
enum SocialPlatform: String, CaseIterable {
case twitter
case facebook
case instagram
}
print(SocialPlatform.allCases) // twitter, facebook, instagram
Ключевое слово fallthrough заставляет выполнение программы продолжаться от одного случая в операторе switch к следующему случаю. Пример:
enum ImageType {
case jpeg
case png
case gif
}
let imageTypeToDescribe = ImageType.gif
var description = "The image type \(imageTypeToDescribe) is"
switch imageTypeToDescribe {
case .gif:
description += " animatable, and also"
fallthrough
default:
description += " an image."
}
print(description) // The image type gif is animatable, and also an image.
- ✔️ Working with throwing functions in Swift
- ✔️ When should you write throwing functions?
- ✔️ Running throwing functions
- ✔️ Why does Swift make us use try before every throwing function?
- ✔️ Optional try
Пример, взятый отсюда:
enum PasswordError: Error {
case obvious
}
func checkPassword(_ password: String) throws -> Bool {
if password == "password" {
throw PasswordError.obvious
}
return true
}
do {
try checkPassword("password")
print("That password is good!")
} catch {
print("You can't use that password.") // You can't use that password.
}
Обязательно должен быть
Error
протокол у enum;Обратить внимание где пишется
throws
, а гдеthrow
;Swift не позволит вам случайно запустить
throws
функцию, поэтому нужно использовать do (запускает раздел кода, который может вызвать проблемы), try (используется перед каждой функцией, которая может вызвать ошибку), catch позволяет вам корректно обрабатывать ошибки;
Расширения позволяют вам предоставлять код внутри ваших методов, но влияют только на один тип данных - вы не можете добавить метод к множеству типов одновременно.
Вы можете написать расширения для встроенных протоколов Swift, таких как Identifiable или для типов (Int)
Если расширение меняет саму себя, то нужно использовать mutating
префикс перед функциями, чтобы сделать self mutable
extension String {
mutating func append(_ other: String) {
self += other
}
}
Методы, добавленные с использованием расширений, неотличимы от методов, которые изначально были частью типа, но есть разница для свойств: расширения не могут добавлять новые сохраненные свойства, а только вычисляемые свойства