1. 類和結(jié)構(gòu)體對比
1.1 定義語法
你每次定義一個(gè)新類或者結(jié)構(gòu)體的時(shí)候,實(shí)際上你是定義了一個(gè)新的Swift
類型。因此請使用UpperCamelCase
這種方式來命名(如SomeClass
和SomeStructure
等)陌僵,以便符合標(biāo)準(zhǔn)Swift
類型的大寫命名風(fēng)格(如String
戒劫,Int
和Bool
)
定義類和結(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 someResolution = Resolution()
let someVideoMode = VideoMode()
結(jié)構(gòu)體類型的成員逐一構(gòu)造器:
let vga = Resolution(width: 640, height: 480)
與結(jié)構(gòu)體不同传透,類實(shí)例沒有默認(rèn)的成員逐一構(gòu)造器凄敢。
1.2 結(jié)構(gòu)體和枚舉是值類型
值類型被賦予給一個(gè)變量凉唐、常量或者被傳遞給一個(gè)函數(shù)的時(shí)候,其值會被拷貝霍骄。
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
print(hd)
print(cinema)
// print "Resolution(width: 1920, height: 1080)"
// print "Resolution(width: 2048, height: 1080)"
枚舉也是值類型台囱。
在Swift
中,所有的基本類型:整數(shù)(Integer)读整、浮點(diǎn)數(shù)(floating-point)簿训、布爾值(Boolean)、字符串(string)米间、數(shù)組(array)和字典(dictionary)强品,都是值類型,并且在底層都是以結(jié)構(gòu)體的形式所實(shí)現(xiàn)屈糊。
1.3 類是引用類型
與值類型不同的榛,引用類型在被賦予到一個(gè)變量、常量或者被傳遞到一個(gè)函數(shù)時(shí)逻锐,其值不會被拷貝困曙。因此,引用的是已存在的實(shí)例本身而不是其拷貝谦去。
如果能夠判定兩個(gè)常量或者變量是否引用同一個(gè)類實(shí)例將會很有幫助。為了達(dá)到這個(gè)目的蹦哼,Swift 內(nèi)建了兩個(gè)恒等運(yùn)算符:
- 等價(jià)于(
===
) - 不等價(jià)于(
!==
)
1.4 類和結(jié)構(gòu)體的選擇
按照通用的準(zhǔn)則鳄哭,當(dāng)符合一條或多條以下條件時(shí),請考慮構(gòu)建結(jié)構(gòu)體:
- 該數(shù)據(jù)結(jié)構(gòu)的主要目的是用來封裝少量相關(guān)簡單數(shù)據(jù)值纲熏。
- 有理由預(yù)計(jì)該數(shù)據(jù)結(jié)構(gòu)的實(shí)例在被賦值或傳遞時(shí)妆丘,封裝的數(shù)據(jù)將會被拷貝而不是被引用。
- 該數(shù)據(jù)結(jié)構(gòu)中儲存的值類型屬性局劲,也應(yīng)該被拷貝勺拣,而不是被引用。
- 該數(shù)據(jù)結(jié)構(gòu)不需要去繼承另一個(gè)既有類型的屬性或者行為鱼填。
1.5 字符串药有、數(shù)組、和字典類型的賦值與復(fù)制行為
Swift 中苹丸,許多基本類型愤惰,諸如String
,Array
和Dictionary
類型均以結(jié)構(gòu)體的形式實(shí)現(xiàn)赘理。這意味著被賦值給新的常量或變量宦言,或者被傳入函數(shù)或方法中時(shí),它們的值會被拷貝商模。
Objective-C 中NSString
奠旺,NSArray
和NSDictionary
類型均以類的形式實(shí)現(xiàn)蜘澜,而并非結(jié)構(gòu)體。它們在被賦值或者被傳入函數(shù)或方法時(shí)响疚,不會發(fā)生值拷貝鄙信,而是傳遞現(xiàn)有實(shí)例的引用。
注意
以上是對字符串稽寒、數(shù)組扮碧、字典的“拷貝”行為的描述。在你的代碼中杏糙,拷貝行為看起來似乎總會發(fā)生慎王。然而,Swift 在幕后只在絕對必要時(shí)才執(zhí)行實(shí)際的拷貝宏侍。Swift 管理所有的值拷貝以確保性能最優(yōu)化赖淤,所以你沒必要去回避賦值來保證性能最優(yōu)化。