swift-04-枚舉、結構體、類

最近在學習swift,期間也看了不少教程和大神的博客,最後把筆記放這裏,方便查看複習~swift

附上學習資料地址:w3cschool-Swift 教程YungFan大神的簡書(推薦看一下,有些知識點總結地簡直通俗易懂)markdown

1、枚舉

一、介紹

enum:枚舉是一種類型,能夠像類和結構體同樣,擁有本身的屬性和方法函數

swift中的枚舉,能夠提供的值類型有:字符串,字符,整型值,浮點值等。這一點不一樣於oc,oc中是默認整型值oop

//定義Int類型的枚舉
enum CompassPoint:Int {
  case North
  case South
  case East
  case West
}


let stt: CompassPoint = .South
//經過rawValue拿到原始值,由於是int類型,默認從0開始
print(stt.rawValue)
複製代碼

經過rawValue獲取枚舉值設定的原始值學習

注意:spa

  • 原始值區分大小寫
  • 經過rawValue返回的枚舉是一個可選型,由於原始值對應的枚舉值不必定存在
  • 若是是int類型,只指定第一個元素的原始值以後,後面的元素的原始值可以默認+1

二、使用

遍歷:code

//經過聲明的時候添加 CaseIterable 來容許遍歷
enum CompassPoint:Int, CaseIterable {
  case North
  case South
  case East
  case West
}
//經過allCases進行遍歷
for method in CompassPoint.allCases {
    print(method)
}
複製代碼

2、結構體

一、介紹

struct:聲明結構體,內部能夠聲明成員變量、成員方法。所以更接近於一個類,能夠說是類的一個輕量化實現orm

注意:對象

  • 結構體實例老是經過值傳遞來定義你的自定義數據類型。繼承

  • 結構體老是經過被複制的方式在代碼中傳遞,所以它的值是不可修改的。

  • 若是要在成員方法中去改變成員屬性,須要關鍵字mutating

二、初始化

struct Person {
    var name = "Zhangsan"
    var age = 10
    var sex = "man"
    func say(){
        print("人會說話")
    }
}


//初始化寫法1:只有成員變量擁有默認值的時候才能使用
var p1 = Person()


//初始化寫法2:從新賦值
var p2= Person(name: "Lisi", age: 20, sex: "woman")

複製代碼

代碼示例:

//聲明:
struct Person {
    var name:String
    var age:Int
    
    func introduce(){
        print("我叫:\(name),今年\(age)歲")
    }
}

//調用:
var person = Person(name: "xiaoMing",age: 20)

person.introduce()

//輸出:
我叫:xiaoMing,今年20歲
複製代碼

三、應用場景

  • 結構體的主要目的是用來封裝少許相關簡單數據值。
  • 有理由預計一個結構體實例在賦值或傳遞時,封裝的數據將會被拷貝而不是被引用。
  • 任何在結構體中儲存的值類型屬性,也將會被拷貝,而不是被引用。
  • 結構體不須要去繼承另外一個已存在類型的屬性或者行爲。

四、實例場景

  • 幾何形狀的大小,封裝一個width屬性和height屬性,二者均爲Double類型。
  • 必定範圍內的路徑,封裝一個start屬性和length屬性,二者均爲Int類型。
  • 三維座標系內一點,封裝x,y和z屬性,三者均爲Double類型。

不一樣狀況的操做:

//聲明方式1:直接給成員變量賦值
struct myStruct1 {
    var num1 = 100
    var num2 = 200
    var num3 = 300
}

//聲明方式2:成員變量經過初始化參數進行賦值
struct myStruct2 {
    var num1: Int
    var num2: Int
    var num3: Int
    
    init(mark: Int) {
        self.num1 = mark
        self.num2 = mark * 2
        self.num3 = mark * 3
    }
}
複製代碼

調用:

let stu1 = myStruct1()
print(stu1.num1,stu1.num2,stu1.num3)

let stu2 = myStruct2(mark: 500)
print(stu2.num1,stu2.num2,stu2.num3)

//值拷貝
var stu3 = stu2
print("修改前: \(stu3.num1)")
stu3.num1 = 600
print("修改後: \(stu3.num1)")
複製代碼

打印:

100 200 300
500 1000 1500
修改前: 500
修改後: 600
複製代碼

3、類

一、介紹

class: swift中用class關鍵字定義類,經過.(點語法)進行訪問類的屬性和方法

二、使用

定義:

class Person {
    var name = "Zhangsan"
    var age = 10
  
    func say(){
        print("\(name)說話了")
    }
}

//調用
var p1 = Person()
p1.say()
複製代碼

注意:類默認沒有自動實現構造函數,若是聲明成員變量的時候沒有賦值,就須要實現構造函數來進行賦值,不然沒法編譯

class Person {
    var name : String
    var age : Int

    init(name : String, age : Int) {
         
        self.name = name
        self.age = age
    }
 
}

//調用
var p1 = Person(name: "zhangsan", age: 10)
複製代碼

4、 structclass比較

struct是結構體,class是類

  • 一、struct是值類型,class是引用類型;意思是:聲明一個新的變量指向這個結構體,改變某個屬性,本來的結構體屬性不會發生變化;而類會隨着改變

代碼示例:

struct myStru {
    var width = 200
}

class myClass {
    var width = 200
}


//調用
var stu = myStru()
var stu2 = stu
stu2.width = 300
print(stu.width,stu2.width)
//200  300


var cls = myClass()
var cls2 = cls
cls2.width = 300
print(cls.width,cls2.width)
//300 300
複製代碼
  • 二、struct不能被繼承,class能夠被繼承

  • 三、用let修飾class對象,可以修改類的值;若要修改struct的值,要用var來修飾

  • 四、struct是放在棧上,class是放在堆上,所以struct的訪問速度更快

  • 五、struct裏面若是想聲明一個func來修改聲明的屬性,須要添加關鍵字mutating,才能編譯成功;而class不須要

  • 六、全部的struct都有一個自動生成的成員構造器,而class須要本身生成

  • 七、在struct中,成員變量能夠沒有初始值;但在class中,若是成員變量沒有初始值,就必須爲它寫一個構造函數

相關文章
相關標籤/搜索