Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體
前言
和其他語(yǔ)言不同的是,Swift不需要為自定義的類和結(jié)構(gòu)體創(chuàng)建接口和實(shí)現(xiàn)文件。只需要?jiǎng)?chuàng)建單一文件用來(lái)創(chuàng)建類和結(jié)構(gòu)體,其他的外部接口的代碼系統(tǒng)會(huì)自動(dòng)生成。下面這篇文章主要介紹了關(guān)于Swift 3.0類與結(jié)構(gòu)體的內(nèi)容,感興趣的朋友一起來(lái)看看吧。
類和結(jié)構(gòu)體區(qū)別
Swift的類和結(jié)構(gòu)體具有以下相同的特點(diǎn):
- 可以定義屬性來(lái)保存值
- 可以定義方法來(lái)提供功能
- 可以定義下標(biāo)來(lái)使用他們的值
- 可以定義初始化器來(lái)配置他們的初始化狀態(tài)
- 可以在默認(rèn)的實(shí)現(xiàn)上擴(kuò)展他們的功能
- 遵從協(xié)議來(lái)提供標(biāo)準(zhǔn)的功能
類具有結(jié)構(gòu)體沒(méi)有的額外的功能:
- 繼承允許某一個(gè)類繼承另外一個(gè)類的特性
- 類型轉(zhuǎn)換允許你檢查并在運(yùn)行時(shí)解釋一個(gè)類實(shí)例的類型
- 析構(gòu)器允許釋放所有該類已經(jīng)賦值的實(shí)例資源
- 引用計(jì)數(shù)允許多個(gè)引用一個(gè)類的實(shí)例
結(jié)構(gòu)體一般來(lái)說(shuō)賦值的時(shí)候是直接拷貝的,沒(méi)有使用引用計(jì)數(shù)的機(jī)制。
符號(hào)定義
下面是一個(gè)定義結(jié)構(gòu)體和類的例子:
struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? }
結(jié)構(gòu)體初始化的時(shí)候可以直接
let vga = Resolution(width: 640, height: 480)
這點(diǎn)和類不一樣,類沒(méi)有默認(rèn)的逐個(gè)成員的初始化器。
結(jié)構(gòu)體和枚舉是值類型
let hd = Resolution(width: 1920, height: 1080) var cinema = hd
再賦值
cinema.width = 2048
結(jié)果
print("cinema is now \(cinema.width) pixels wide") // Prints "cinema is now 2048 pixels wide"
然而hd.width還是1920
print("hd is still \(hd.width) pixels wide") // Prints "hd is still 1920 pixels wide"
可見(jiàn)賦值過(guò)程是做了一次深度拷貝。
枚舉也是具有同樣的行為, 如以下例子,rememberedDirection的值并沒(méi)有改變:
enum CompassPoint { case north, south, east, west } var currentDirection = CompassPoint.west let rememberedDirection = currentDirection currentDirection = .east if rememberedDirection == .west { print("The remembered direction is still .west") } // Prints "The remembered direction is still .west"
類是引用類型
例如:
let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlaced = true tenEighty.name = "1080i" tenEighty.frameRate = 25.0
進(jìn)行賦值引用
let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0
結(jié)果
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)") // Prints "The frameRate property of tenEighty is now 30.0"
標(biāo)識(shí)符
- 完全相同(===)
- 不完全相同(!===)
if tenEighty === alsoTenEighty { print("tenEighty and alsoTenEighty refer to the same VideoMode instance.") } // Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
完全相同(===)和等于(==)是不一樣的:
- 完全相同意思是兩個(gè)類類型的常量或者變量指向完全相同的類實(shí)例
- 等于意思是兩個(gè)實(shí)例被認(rèn)為值相同或者相等, 可以自行定義==操作符來(lái)進(jìn)行判斷兩個(gè)實(shí)例在某種意義上是相等的
選擇使用類和結(jié)構(gòu)體
由于結(jié)構(gòu)體的實(shí)例一般是值傳遞,而類實(shí)例一般是引用傳遞,因此你需要根據(jù)實(shí)際情況來(lái)考慮應(yīng)該定義一個(gè)類還是結(jié)構(gòu)體.
如有以下一種或多仲情況使用結(jié)構(gòu)體:
- 結(jié)構(gòu)體主要的目的是封裝少量的相關(guān)性簡(jiǎn)單數(shù)據(jù)值
- 在結(jié)構(gòu)體的實(shí)例賦值或者傳遞的時(shí)候,需要考慮到封裝好的值會(huì)被拷貝而不是引用是否是合理的
- 任何保存于結(jié)構(gòu)體的屬性都是值類型的,他們也是期望被賦值或者傳遞時(shí)是拷貝而不是引用
- 結(jié)構(gòu)體不需要從其他存在的類型繼承屬性或者行為
看看幾個(gè)使用結(jié)構(gòu)體恰當(dāng)?shù)睦樱?/p>
- 幾何圖形的大小,可以封裝width和height屬性,都是Double類型
- 指向連續(xù)序列范圍的方法,可以封裝start和length屬性,都是Int類型
- 一個(gè)在3D坐標(biāo)系統(tǒng)的點(diǎn), 可以封裝x, y和z屬性,都是Double類型
其他的情況請(qǐng)定義類并創(chuàng)建類實(shí)例,管理和傳遞都使用引用。
在實(shí)踐中,大部分的自定義數(shù)據(jù)結(jié)構(gòu)都是使用類居多,很少使用結(jié)構(gòu)體。
String、Array和Dictionary的賦值和拷貝行為
String, Array和 Dictionary都是結(jié)構(gòu)體,因此賦值直接是拷貝,而NSString, NSArray 和NSDictionary則是類,所以是使用引用的方式。
參考英語(yǔ)原文:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
本地推送通知UserNotifications在Swift中的實(shí)現(xiàn)方式
這篇文章主要介紹了本地推送通知UserNotifications在Swift中的實(shí)現(xiàn)方式,想了解消息推送的同學(xué),一定要看一下2021-04-04淺談Swift編程中switch與fallthrough語(yǔ)句的使用
這篇文章主要介紹了Swift編程中switch與fallthrough語(yǔ)句的使用,用于基本的流程控制,需要的朋友可以參考下2015-11-11Swift設(shè)置UILabel內(nèi)邊距的實(shí)例代碼
有時(shí)候,我們需要一個(gè)顯示文字,又想這些文字與邊界之間有自定義的邊距,所以下面這篇文章主要給大家介紹了關(guān)于Swift設(shè)置UILabel內(nèi)邊距的相關(guān)資料,需要的朋友可以參考下2021-10-10Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果
這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11