前言
和其他語言不同的是,Swift不需要為自定義的類和結構體創(chuàng)建接口和實現(xiàn)文件。只需要創(chuàng)建單一文件用來創(chuàng)建類和結構體,其他的外部接口的代碼系統(tǒng)會自動生成。下面這篇文章主要介紹了關于Swift 3.0類與結構體的內(nèi)容,感興趣的朋友一起來看看吧。
類和結構體區(qū)別
Swift的類和結構體具有以下相同的特點:
類具有結構體沒有的額外的功能:
結構體一般來說賦值的時候是直接拷貝的,沒有使用引用計數(shù)的機制。
符號定義
下面是一個定義結構體和類的例子:
struct Resolution { var width = 0 var height = 0}class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String?}
結構體初始化的時候可以直接
let vga = Resolution(width: 640, height: 480)
這點和類不一樣,類沒有默認的逐個成員的初始化器。
結構體和枚舉是值類型
let hd = Resolution(width: 1920, height: 1080)var cinema = hd
再賦值
cinema.width = 2048
結果
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"
可見賦值過程是做了一次深度拷貝。
枚舉也是具有同樣的行為, 如以下例子,rememberedDirection的值并沒有改變:
enum CompassPoint { case north, south, east, west}var currentDirection = CompassPoint.westlet rememberedDirection = currentDirectioncurrentDirection = .eastif rememberedDirection == .west { print("The remembered direction is still .west")}// Prints "The remembered direction is still .west"
類是引用類型
例如:
let tenEighty = VideoMode()tenEighty.resolution = hdtenEighty.interlaced = truetenEighty.name = "1080i"tenEighty.frameRate = 25.0
進行賦值引用
let alsoTenEighty = tenEightyalsoTenEighty.frameRate = 30.0
結果
print("The frameRate property of tenEighty is now /(tenEighty.frameRate)")// Prints "The frameRate property of tenEighty is now 30.0"
標識符
if tenEighty === alsoTenEighty { print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")}// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
完全相同(===)和等于(==)是不一樣的:
選擇使用類和結構體
由于結構體的實例一般是值傳遞,而類實例一般是引用傳遞,因此你需要根據(jù)實際情況來考慮應該定義一個類還是結構體.
如有以下一種或多仲情況使用結構體:
看看幾個使用結構體恰當?shù)睦樱?/p>
其他的情況請定義類并創(chuàng)建類實例,管理和傳遞都使用引用。
在實踐中,大部分的自定義數(shù)據(jù)結構都是使用類居多,很少使用結構體。
String、Array和Dictionary的賦值和拷貝行為
String, Array和 Dictionary都是結構體,因此賦值直接是拷貝,而NSString, NSArray 和NSDictionary則是類,所以是使用引用的方式。
參考英語原文:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。
新聞熱點
疑難解答