-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathContents.swift
77 lines (61 loc) · 1.61 KB
/
Contents.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//: Playground - noun: a place where people can play
// Powered by https://maimieng.com from https://github.com/kingcos/Swift-X-Design-Patterns
import UIKit
// 协议
protocol Operator {
var nums: (Double, Double) { get set }
func getResult() -> Double?
}
// 遵守协议
struct Addition: Operator {
var nums = (0.0, 0.0)
func getResult() -> Double? {
return nums.0 + nums.1
}
}
struct Subtraction: Operator {
var nums = (0.0, 0.0)
func getResult() -> Double? {
return nums.0 - nums.1
}
}
struct Multiplication: Operator {
var nums = (0.0, 0.0)
func getResult() -> Double? {
return nums.0 * nums.1
}
}
struct Division: Operator {
var nums = (0.0, 0.0)
func getResult() -> Double? {
guard nums.1 != 0 else {
return nil
}
return nums.0 / nums.1
}
}
// 操作符枚举
enum Operators {
case addition, subtraction, multiplication, division
}
// 工厂
struct OperatorFactory {
static func calculateForOperator(_ opt: Operators) -> Operator {
switch opt {
case .addition:
return Addition()
case .subtraction:
return Subtraction()
case .multiplication:
return Multiplication()
case .division:
return Division()
}
}
}
var testDivision = OperatorFactory.calculateForOperator(.division)
testDivision.nums = (1, 0)
print(testDivision.getResult() ?? "Error")
var testAddition = OperatorFactory.calculateForOperator(.addition)
testAddition.nums = (1, 1)
print(testAddition.getResult() ?? "Error")