SWIFT 5. 列舉 (Enum), 類別(Class), 結構(Structure)
列舉 (Enum)
列舉為一個新的型別, 所以必需依照camel naming, 每個單字字首均為大寫
enum MyType {
case A
case B
case C
}
//多個定義式可寫在同一行
enum MyType {
case A, B, C
}
//若以switch來匹配enum, 則enum中所有case都要列舉, 或者要加上default值
var mt = MyType.A
switch mt {
case .A:
print("A")
case .B:
print("B")
}
//未宣告csae .C, 在compile時會出現error
//關聯值 : 每個enum item可以自帶不同的資料類型
enum Man {
case Warrior (Int, String)
case Magic (Int,Int)
case Rogue (Int, Bool)
}
var newOne = Man.Magic(100,100)
print(newOne)
newOne = .Rogue(200, true)
print(newOne)
//Case 1
switch newOne {
case .Warrior (let HP, let Power):
print("\(HP) - \(Power)")
case .Magic (let HP, let MP):
print("\(HP) - \(MP)")
case .Rogue(let HP, let Hide):
print("\(HP) - \(Hide)")
}
//Case 2
switch newOne {
case let .Warrior (HP, Power):
print("\(HP) - \(Power)")
case let .Magic (HP, MP):
print("\(HP) - \(MP)")
case let .Rogue( HP, Hide):
print("\(HP) - \(Hide)")
}
//原始值: 指派值給enum item, 不得重覆, 必需為同型別, 若使用Int做為原始值, 若其他項目沒有特別設定, 則會自動遞增
enum AnimalOrder : Int {
case Rat=1, Ox, Tiger, Rabbit, Dragon
}
print("\(AnimalOrder.Rabbit.rawValue)")
var one = AnimalOrder(rawValue:3)
print(one!)
類別(Class)
class ClassName {
...
}
結構(Structure)
struct StructName {
...
}
屬性(Properties)
//延遲屬性: Lazy binding: 當宣告為Lazy時, 直到第一次叫用才會實際產生值
class CountVal {
init () {
var i=0
for _ in 0...9999 {
i++
}
}
}
class Data1 {
var result = CountVal()
}
var t1 = Data1() //此時已產生result值
class Data2 {
lazy var result = CountVal()
}
var t2 = Data2() //此時未產生result值
var t2Result = t2.result //此時才產生result值
計算屬性: 經由計算產生(getter/setter)
//get/set
struct Years {
var year = 0
var yearROC : Int {
get {
return (year - 1911)
}
set (newYearROC) {
year = newYearROC + 1911
}
}
}
//Simplx set
struct Years {
var year = 0
var yearROC : Int {
get {
return (year - 1911)
}
set {
year = newValue + 1911
}
}
}
//Read Only :only has get
struct Years {
var year = 0
var yearROC : Int {
get {
return (year - 1911)
}
}
}
//Simplex Read Only
struct Years {
var year = 0
var yearROC : Int {
return (year - 1911)
}
}
屬性觀察者 Property Observers (willSet : 在屬性修改前被呼叫/didSet:在屬性修改後被呼叫)
var val = 100 {
willSet(newVal) {
print("Original val=\(val), will be set to \(newVal)")
}
didSet {
print("Original val=\(oldValue), will be set to \(val)")
}
}
}
靜態屬性 Static Property
struct Man{
static var leg = 2
var age = 30
}
let newMan = Man()
print(newMan.age) //一般屬性, 使用實體名稱來叫用
print(Man.leg) //靜態屬性, 使用類別名稱來叫用
方法 Method
- self : 指向clas/struct本身
- 在struct中的func, 要修改其他屬性值, 要將此func宣告為變異(mutating)
struct A {
var a=0
mutating func add(num:Int) {
self.a += num
}
}
var a = A()
a.add(10)
print(a)
下標 Subscript Syntax : 取Item by Index
- 可多重參數
class A {
var item = [1,2,3]
subscript(index : Int) -> Int {
get {
....
}
set(newValue) {
....
}
}
}
- Felix Lai