Руководство Swift Enum
View more Tutorials:


В Swift, используется ключевое слово enum чтобы определить набор перечисленных элементов, вы не можете добавить или убрать количество элементов. Например, вы можете определить набор дней в неделе (Понедельник, вторник, ..., Воскресение)
Если не имеется enum, чтобы создать набор дней недели, вы можете определить 7 чисел, представляющие дни недели.
WeekDayConstants.swift
import Foundation
// Опредеалить 7 констант, представляющих дни недели.
let CONST_MONDAY = 2;
let CONST_TUESDAY = 3;
let CONST_WEDNESDAY = 4;
let CONST_THURSDAY = 5;
let CONST_FRIDAY = 6;
let CONST_SATURDAY = 7;
let CONST_SUNDAY = 1;
Модельная функция возвращает назврание работы соответствующей определенному дню недели. (Похоже на расписание)
GetJobByDay.swift
import Foundation
// Переданным параметром является день недели.
// Возвращает название работы.
func getJobByDay(dayInWeek: Int) -> String {
if (dayInWeek == CONST_SATURDAY
|| dayInWeek == CONST_SUNDAY) {
return "Nothing";
}
return "Coding";
}
Можно увидеть, что код выше не безопасен. Например, когда вы определяете значение дней недели и они случайно совпадают. Или вызываете функцию getJobByDay(Int) но входной параметр еще не входит в предопределенные значения.
- No Type-Safety: Для начала это не безопасный вид, вы можете вызвать метод getJobByDay(Int) и передать любые значения Int.
- No Meaningful Printing: Если вы хотите распечатать дни недели, распечатается число вместо слова "Понедельник".
И это способ создания enum, специальный набор.
WeekDay.swift
import Foundation
// Define an Enumeration.
enum WeekDay {
// Elements
case MONDAY
case TUESDAY
case WEDNESDAY
case THURSDAY
case FRIDAY
case SATURDAY
case SUNDAY
}
Например, используя Enum:
WeekDayTest.swift
import Foundation
// Возвращает название работы.
func getJob(weekDay: WeekDay) -> String {
if (weekDay == WeekDay.SATURDAY || weekDay == WeekDay.SUNDAY) {
return "Nothing"
}
return "Coding"
}
func test_getJob() {
var weekDay = WeekDay.TUESDAY
print("Day = \(weekDay)")
var job = getJob(weekDay)
print("Job = \(job)")
}
Нет определенной функции или метода, который позволит вам получить список элементов любого Enum, но вы можете сами дать определение переменной, которая включает все элементы Enum.
Данный пример определяет Enum, в Enum так же определяется константа содержащая все его элементы.
Season.swift
import Foundation
// Сезоны года.
enum Season {
case Spring
case Summer
case Autumn
case Winter
// Статическая константа, содержащая элементы (element) Enum.
static let allValues = [Spring, Summer, Autumn, Winter]
}
GetAllSeasons.swift
import Foundation
func test_getAllSeasons() {
for season in Season.allValues {
print(season)
}
}
Результаты запуска примера:
Spring
Summer
Autumn
Winter
Похоже на примитивные виды данных (Int,Float,..) Enum может использоваься как параметр в команде switch.
Посмотрим на пример:
Посмотрим на пример:
SwitchDemo.swift
import Foundation
func test_switchEnum() {
var day = WeekDay.THURSDAY;
switch (day) {
case .MONDAY:
print("Working day");
case .SATURDAY, .SUNDAY :
print("Holiday");
default:
print(day);
}
}
Изменить код main.swift:
main.swift
import Foundation
test_switchEnum()
Запуск примера:
THURSDAY
Вы можете определить Enum с необработанными значениями (raw values), необработанные значения могуть быть вида String, character, Int, Number,... Такой Enum расширяет один из видов String, Character, Int,..
Например, вы можете определить Enum является набором месяцев в году, данный набор будет содержать необработанные значения от 1 до 12.
Например, вы можете определить Enum является набором месяцев в году, данный набор будет содержать необработанные значения от 1 до 12.
RawValueEnum.swift
import Foundation
// Определить Enum, который является списком месяцев в году.
// Он расширен (extends) из Int
enum Month : Int {
// Прикрепить необработанное значение (raw value) первому элементу.
// (Если одному элементу не прикрепили необработанное значение,
// Его значение по умолчанию является значение впереди стоящего элемента плюс 1).
case January = 1,
February, March, April, May, June,
July, August, September, October, November, December
// Статическая константа содержит все элементы enum Month.
static let allValues = [January,February, March,
April, May, June, July, August,
September, October, November, December]
}
//
enum Suit:String {
case Spades = "♠"
case Hearts = "♥"
case Diamonds = "♦"
case Clubs = "♣"
// Статическая константа содержит все элементы enum Suit.
static let allValues = [Spades,Hearts,Diamonds,Clubs]
}
Распечатать элементы enum Month, и соответсвующие необработанные данные (raw value).
RawValueEnumTest.swift
import Foundation
func test_MonthEnum() {
// Распечатать все элементы и необработанные значения (raw value) Enum.
print("All element/raw value of Month enum");
for e in Month.allValues {
let rawValue = e.rawValue
print("Element \(e), raw value: \(rawValue)" );
}
print("---------------------");
// Распечатать все элементы и необработанные значения (raw value) Enum.
print("All element/raw value of Suit enum");
for e in Suit.allValues {
let rawValue = e.rawValue
print("Element \(e), raw value: \(rawValue)" );
}
}
Запуск примера:
All element/raw value of Month enum
Element January, raw value: 1
Element February, raw value: 2
Element March, raw value: 3
Element April, raw value: 4
Element May, raw value: 5
Element June, raw value: 6
Element July, raw value: 7
Element August, raw value: 8
Element September, raw value: 9
Element October, raw value: 10
Element November, raw value: 11
Element December, raw value: 12
---------------------
All element/raw value of Suite enum
Element Spades, raw value: ♠
Element Hearts, raw value: ♥
Element Diamonds, raw value: ♦
Element Clubs, raw value: ♣
Вы можете создать Enum с элементам содержащими значения ассоциированными с ним.
Я предположу ситуацию, вы создаете Enum содержаций виды рекламы.
- GIFT: Подарок
- DISCOUNT: Скидка
- MONEY: Денежный подарок
- SHIPPING: Бесплатная доставка.
Проблема в том, что в каждом виде рекламы, имеется связанные с ней значения, например подарок (GIFT) что подарить, какое количество. Или денежный подарок (MONEY) то какую сумму денег подарить,...
И так каждый элемент Enum имеет разные параметры. Посмотрим пример:
И так каждый элемент Enum имеет разные параметры. Посмотрим пример:
Promotion.swift
import Foundation
// Виды промоушна.
enum Promotion {
// Подарок (Название подарка и количество)
case GIFT (name: String, quantity: Int)
// Скидка (процент 0 - 100)
case DISCOUNT(percent: Int)
// Денежный приз (Сумма).
case MONEY(amount : Int)
// Бесплатная доставка
case SHIPPING
}
Enum Promotion имеет только 4 параметра, вы не можете добавить или убрать эти элементы, они имеют связанные значения с элементами определяющими время запуска рекламы.
PromotionTest.swift
import Foundation
// Симуляция покупки и получения промоушна.
func getRandomPromotion() -> Promotion {
// Случайное значение.
var random: UInt32 = arc4random()
// Деление на 4 и получить остаток (0, 1, 2, 3).
random = random % 4
switch random {
case 0:
return Promotion.DISCOUNT(percent: 10)
case 1:
return Promotion.GIFT(name: "Doll", quantity: 1)
case 2:
return Promotion.MONEY(amount: 100)
case 3:
return Promotion.SHIPPING
default:
return Promotion.SHIPPING
}
}
func test_Promotion() {
var myProm = getRandomPromotion()
print("Get Promotion: \(myProm)")
switch myProm {
case .DISCOUNT(let percent):
print("Percent is: \(percent)")
case .GIFT(let name, let quantity ):
print("Gift name: \(name), quantity: \(quantity)")
case .MONEY(let amount) :
print("Amount: \(amount)")
default:
print(myProm)
}
}
Изменить main.swift:
main.swift
import Foundation
test_Promotion()
Запуск примера:
Get Promotion: GIFT("Doll", 1)
Gift name: Doll, quantity: 1
Вы можете определить методы в Enum, смотрите пример:
Currency.swift
import Foundation
// Валюта (Currency).
enum Currency {
case USD
case YEN
case VND
func description() -> String {
switch self {
case USD:
return "America's currency"
case YEN:
return "Japan's currency"
case VND :
return "Vietnam's currency"
}
}
}