以下用几个简单的例子来说明枚举在SwiftUI中的使用。
最常用的枚举
struct EnumUIView: View {
var body: some View {
VStack{
Text("Hello, Swift!").padding()
Button("Enum tests"){
let testResult = TestResults.success
runMyTests(results: testResult)
}
}
}
func runMyTests(results:TestResults){
switch results{
case .success:
print("Success")
case .failure:
print("Failed")
}
}
}
enum TestResults{
case success
case failure
}
struct EnumUIView_Previews: PreviewProvider {
static var previews: some View {
EnumUIView()
}
}
枚举增加额外的功能
import SwiftUI
struct EnumUIView: View {
var body: some View {
VStack{
Text("Hello, Swift!").padding()
Button("Enum tests"){
let testResult01 = TestResults.success(["Execute Success", "Report Success"])
runMyTests(results: testResult01)
let testResult02 = TestResults.failure(401)
runMyTests(results: testResult02)
}
}
}
func runMyTests(results:TestResults){
switch results{
case .success(let results):
print("Success: \(results)")
case .failure(let errorID):
print("Failed, error code: \(errorID)")
}
}
}
enum TestResults{
case success([String])
case failure(Int)
}
struct EnumUIView_Previews: PreviewProvider {
static var previews: some View {
EnumUIView()
}
}
将泛型应用到枚举
import SwiftUI
struct EnumUIView: View {
var body: some View {
VStack{
Text("Hello, Swift!").padding()
Button("Enum tests"){
let testResult01 = TestResults<[String], Int>.success(["Execute Success", "Report Success"])
runMyTests(results: testResult01)
let testResult02 = TestResults<[String], Int>.failure(401)
runMyTests(results: testResult02)
}
}
}
func runMyTests(results:TestResults<[String], Int>){
switch results{
case .success(let results):
print("Success: \(results)")
case .failure(let errorID):
print("Failed, error code: \(errorID)")
}
}
}
enum TestResults<T1, T2>{
case success(T1)
case failure(T2)
}
struct EnumUIView_Previews: PreviewProvider {
static var previews: some View {
EnumUIView()
}
}
大家可以看到,后面两个例子在枚举中增加了一些额外的功能。尤其是泛型到引入,会使到我们定义的枚举更加的灵活和强大。这个只是一个简单的例子,在实际的应用中,我们可能会在我们的数据中定义复杂的逻辑,这个时候泛型的灵活会给我们带来很大的方便。
最后看官方教材中的一个例子。我们可以看到“Result<Int, Error>”就是一个典型的泛型枚举的应用。
static func save(employees: [Employee], completion: @escaping (Result<Int, Error>)->Void) {
DispatchQueue.global(qos: .background).async {
do {
let data = try JSONEncoder().encode(employees)
let outfile = try fileURL()
try data.write(to: outfile)
DispatchQueue.main.async {
completion(.success(employees.count))
}
} catch {
DispatchQueue.main.async {
completion(.failure(error))
}
}
}
}
这个枚举的定义是:
@frozen public enum Result<Success, Failure> where Failure : Error