Перечисления Swift

Перечисления, попросту говоря, тоже являются типом данных, только этот тип данных содержит лишь определённые пользователем данные; это набор данных с общими характеристиками.

Перечисления Swift похожи на конструкции в Objective-C и C. Особенности перечислений таковы:

  • Оно объявляется в классе, и к его значению можно получить доступ, создав экземпляр класса.

  • Перечисления также могут определять инициализаторы, чтобы предоставлять начальное значение члена; вы можете расширять их функциональность на основе исходной реализации.

  • Они могут соответствовать протоколам, чтобы предоставлять стандартную функциональность.

Синтаксис

В Swift ключевое слово enum используется для создания перечислений, а всё их определение помещается внутрь пары фигурных скобок:

enum enumname {
   // 枚举定义放在这里
}

Например, мы определяем следующее перечисление, представляющее дни недели:

import Cocoa

// 定义枚举
enum DaysofaWeek {
    case Sunday
    case Monday
    case TUESDAY
    case WEDNESDAY
    case THURSDAY
    case FRIDAY
    case Saturday
}

var weekDay = DaysofaWeek.THURSDAY
weekDay = .THURSDAY
switch weekDay
{
case .Sunday:
    print("星期天")
case .Monday:
    print("星期一")
case .TUESDAY:
    print("星期二")
case .WEDNESDAY:
    print("星期三")
case .THURSDAY:
    print("星期四")
case .FRIDAY:
    print("星期五")
case .Saturday:
    print("星期六")
}

Вывод выполнения вышеуказанной программы:

Thursday

Значения, определённые в перечислении (такие какSunday,Monday,……иSaturday) являютсязначениями членовэтого перечисления (иличленами)。caseКлючевое слово указывает, что будет определена новая строка значений членов.

Примечание: В отличие от C и Objective-C, членам перечисления Swift не присваивается целочисленное значение по умолчанию при создании. В приведённом вышеDaysofaWeekпримере,Sunday,Monday,……иSaturdayне будет неявно присвоено как0,1,……и6. Вместо этого эти члены перечисления сами имеют полные значения, которые уже чётко определеныDaysofaWeekтип.

var weekDay = DaysofaWeek.THURSDAY 

weekDayТип можно вывести, когда онDaysofaWeekинициализируется одним из своих возможных значений. После того какweekDayобъявлен какDaysofaWeek, можно использовать сокращённый синтаксис (.) чтобы присвоить ему другоеDaysofaWeekvalue:

var weekDay = .THURSDAY 

КогдаweekDayКогда тип известен, можно опустить имя перечисления при повторном присваивании ему значения. Использование явно типизированных значений перечисления может сделать код более читаемым.

Перечисления можно разделить на связанные значения и исходные значения.

Разница между связанными значениями и исходными значениями

Связанные значения Исходные значения
Разные типы данных Одинаковый тип данных
Пример: enum {10,0.8,"Hello"} Пример: enum {10,35,50}
Значения создаются на основе констант или переменных Предварительно заполненные значения
Связанные значения устанавливаются только при создании новой константы или переменной на основе члена перечисления, и каждый раз при этом их значение может быть разным. Исходные значения всегда одинаковы

Связанные значения

В следующем примере мы определяем тип перечисления с именем Student, который может быть строкой (String) для Name или связанным значением (Int, Int, Int) для Mark.

import Cocoa

enum Student{
    case Name(String)
    case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Example")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
case .Name(let studName):
    print("学生的名字是: \(studName)。")
case .Mark(let Mark1, let Mark2, let Mark3):
    print("学生的成绩是: \(Mark1),\(Mark2),\(Mark3)。")
}

Вывод выполнения вышеуказанной программы:

学生的成绩是: 98,97,95.

Исходные значения

Исходные значения могут быть строками, символами или любым целочисленным значением или значением с плавающей точкой. Каждое исходное значение должно быть уникальным в пределах объявления его перечисления.

Для перечислений с целочисленными исходными значениями вам не нужно явно присваивать значение каждому члену; Swift автоматически присвоит значения за вас.

Например, когда целые числа используются в качестве исходных значений, неявно присваиваемые значения последовательно увеличиваются на 1. Если первому значению не присвоено начальное значение, оно автоматически устанавливается в 0.

import Cocoa

enum Month: Int {
    case January = 1, February, March, April, May, June, July, August, September, October, November, December
}

let yearMonth = Month.May.rawValue
print("数字月份为: \(yearMonth)。")

Вывод выполнения вышеуказанной программы:

数字月份为: 5.
Другие расширения