Swift 十 類和結構體

2021-07-06 10:59:06 字數 3888 閱讀 8471

1、swift入門學習筆記(第一版),對swift的基礎知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文件為準~

2、在學習完基本的知識點以後會結合官方文件及相關資料,在此版本的基礎上進行新增更改。

在swift中,類和結構體的例項稱作例項而不是物件;同時區別於oc,其自定義類和介面實現檔案在同一檔案

首先將swift中類和結構體常用的通過**演示,其次再說明:

class

person

init(name:string,age:int,job:string)

// 析構函式:delloc自動呼叫的,進行delloc後的一些操作

deinit

// 成員方法 例項方法

func getage() ->int

func getname() ->string

func getjob() ->string

// 類方法,以class開頭

class

func

maxage() ->int

}// 申明乙個物件

var person1 = person()

// swift欄位是public,都可以訪問

person1.age = 21

person1.name = "zhu"

print("\(person1.name)'s job is \(person1.job!)")

var maxage = person.maxage()

print("max age is \(maxage)")

var person2 = person(name: "zhu", age: 22, job: "stu")

print(person2)

output:

zhu's job is student

max age is

100class.person

結構體
//swift裡面的結構體區別於c語言,可以帶建構函式

struct qftest

// 定義帶兩個引數的建構函式

init(x:int,y:int)

// _ 下劃線語法,省略引數名

init(_ x:int,_ y:int)

// 結構體沒有析構函式

// 定義其他函式,比如平均值

func getcenter() ->int

// 給現有的x,y加上乙個delta

// 如果不加mutating系統會報錯

// 由於結構體只是乙個拷貝物件,因此在函式是不能修改結構體的成員變數

mutating func addoffset(deltax:int,deltay:int)

}//結構體的定義及訪問,引數名要帶上,區別於c

var s = qftest(x: 100, y: 200)

print("s.x = \(s.x) s.y = \(s.y)")

var s1 = qftest()

print("s1.x = \(s1.x) s1.y = \(s1.y)")

//_語法,是的形式類似於c,但是官方不建議這樣用

var s2 = qftest(218,218)

print("s2.x = \(s2.x) s2.y = \(s2.y)")

let center = s2.getcenter()

print("center is \(center)")

//這個呼叫引數名的寫法符合swift的規則

s2.addoffset(2, deltay: 100)

print("s2.x = \(s2.x) s2.y = \(s2.y)")

output:

init(x: y:)

s.x = 100 s.y = 200

init

s1.x = 0 s1.y = 0

init(_x: _y:)

s2.x = 218 s2.y = 218

center is 218

s2.x = 220 s2.y = 318

2.1、共同處:

a、定義屬性用於儲存值

b、定義方法用於提供功能

c、定義附屬指令碼用於訪問值

d、定義構造器用於生成初始化值

e、通過擴充套件以增加預設實現的功能

f、實現協議以提供某種標準功能

2.2類相對結構體的附加功能

a、繼承允許乙個類繼承另乙個類的特徵

b、型別轉換允許在執行時檢查和解釋乙個類例項的型別

c、解構器允許乙個類例項釋放任何其所被分配的資源

d、引用計數允許對乙個類的多次引用

注意:結構體中通過複製的方式在**中傳遞,因此不要使用引用計數

值型別:swift中所有的基本型別(整數、浮點數、布林值、字串、陣列和字典)都是值類型,並且都是以結構體的形式在後台所實現

值型別被賦予給乙個變數、常量或者本身被傳遞給乙個函式的時候,實際操作的是其的拷貝

在swift中所有的結構體和列舉型別都是值型別,傳遞至都會被複製

struct qftest 

let onetest = qftest(x: 100, y: 200)

var othertest = onetest

//宣告onetest常量,初始化x,y。又宣告othertest變數,其值為onetest。因為是結構體,所以othertest是onetest的拷貝副本,而不是onetest本身,在後台,是兩個完全不同的例項

othertest.x = 200

print(onetest.x,othertest.x)

output:

100 200
結果不同。同樣列舉也可以同理去驗證其值型別的性質

區別於值型別,引用型別被賦予或者傳遞時,操作的是引用,不是拷貝。

只能用於類型別的判斷!!!

類是引用型別,可能存在多個常量和變數在後時引用同乙個乙個類例項。可以用恒等運算子判斷是否引用同乙個例項

===等價於

!==不等價於

按照通用準則,符合一條或多條時建議構建結構體:

a、結構體的目的是用來封裝少量相關簡單資料值

b、有理由預計乙個結構體例項在賦值或傳遞時,封裝的資料將會被拷貝而不是被引用

c、任何在結構體中儲存的值型別屬性,也將被拷貝,而不是被引用

d、結構體不需要去繼承另乙個已存在型別的屬性或行為

在所有其它案例中,定義乙個類,生成乙個它的例項,並通過引用來管理和傳遞。實際中,這意味著絕大部分的自定義資料構造都應該是類,而非結構體

7.1、swift中的string,array,dictionary型別均以結構體的形式實現。值型別

7.2、oc中的nsstring、nsarray、nsdictionary型別均以類的形式傳遞,區別於swift的值傳遞,發生傳遞時不會發生值拷貝,而是傳遞已存在例項的引用。

7.3、在swift**中並不是在有拷貝行為的地方就發生,在後台只有確有必要,實際拷貝才會被執行。swift管理所有的值拷貝以確保效能最優化,因此沒必要去避免賦值以保證最有效能。

Swift 類和結構體

swift 中類和結構體的共同點 1.定義屬性用於儲存值 2.定義方法用於提供功能 3.定義下標用於訪問值 4.定義構造器用於生成初始化值 5.通過擴充套件以增加預設實現的功能 6.符合協議以對某類提供標準功能 class 不同於 struct 的特點 1.允許乙個類繼承另乙個類的特徵 2.型別轉換...

Swift 結構體和類

結構體 swift結構體也具有封裝的概念 swift結構體比oc c語言裡面的結構體更加進了一步,裡面可以有方法,更接近我們的類 結構體的定義格式 struct結構體名 struct rect var width double 按構造方法賦初值 var height double 方法 func g...

Swift 類和結構體(class struct)

較傳統的oc語言,swift使用了更多的結構體 在 swift 中,所有的基本型別 整數 integer 浮點數 floating point 布林值 boolean 字串 string 陣列 array 和字典 dictionary 都是結構體型別 所以只有熟悉類和結構體各自的特性,才能編寫出更優...