Skip to content

Enumeration, Extention

Попов Эльдар edited this page Aug 19, 2021 · 3 revisions

Enumeration (value type - тип значения)

  1. ✔️ Enum explained in-depth with examples in Swift

Raw value

Если мы устанавливаем 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

С помощью CaseIterable протокола легко выполнить итерации по перечислению или получить общее количество наблюдений. Swift предоставляет коллекцию всех случаев как свойство .allCases типа перечисления, что дает возможность использовать функциональные методы: forEach, filter, и map.

enum SocialPlatform: String, CaseIterable {
    case twitter
    case facebook
    case instagram
}

print(SocialPlatform.allCases) // twitter, facebook, instagram

fallthrough

Ключевое слово 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.

throw/throws

  1. ✔️ Working with throwing functions in Swift
  2. ✔️ When should you write throwing functions?
  3. ✔️ Running throwing functions
  4. ✔️ Why does Swift make us use try before every throwing function?
  5. ✔️ 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 позволяет вам корректно обрабатывать ошибки;

Extention

  1. ✔️ Extensions
  2. ✔️ Protocol extensions

Расширения позволяют вам предоставлять код внутри ваших методов, но влияют только на один тип данных - вы не можете добавить метод к множеству типов одновременно.

Вы можете написать расширения для встроенных протоколов Swift, таких как Identifiable или для типов (Int)

mutating

Если расширение меняет саму себя, то нужно использовать mutating префикс перед функциями, чтобы сделать self mutable

extension String {
	mutating func append(_ other: String) {
		self += other
	}
}

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

Clone this wiki locally