摘要
類和結(jié)構(gòu)體使用相同的語(yǔ)法定義變量,方法和實(shí)例,并且類和結(jié)構(gòu)的聲明和定義不需要放在兩個(gè)分開(kāi)的頭文件和源代碼文件,類和結(jié)構(gòu)體對(duì)外的接口其他代碼默認(rèn)可以直接調(diào)用。
類和結(jié)構(gòu)體有相同點(diǎn),比如屬性和方法的定義,下標(biāo)引用,初始化函數(shù),可擴(kuò)展,符合規(guī)約提供特定功能方法
類比結(jié)構(gòu)體多了如下功能,可繼承,可在運(yùn)行時(shí)獲得實(shí)例類型,可析構(gòu)以釋放內(nèi)存,可引用計(jì)數(shù)
結(jié)構(gòu)體實(shí)例賦值傳遞時(shí),內(nèi)存被另外拷貝一份,所以不會(huì)用到引用計(jì)數(shù)。
我認(rèn)為上面內(nèi)容暫不理解沒(méi)有關(guān)系,我也糊涂著呢,畢竟后面有關(guān)于初始化,繼承,規(guī)約,類型解析,引用計(jì)數(shù)等詳細(xì)介紹。
定義語(yǔ)法如下:
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
//定義實(shí)例使用了構(gòu)造函數(shù),上例兩個(gè)都是使用了默認(rèn)的構(gòu)造函數(shù),都是無(wú)參數(shù)的
let someResolution = Resolution()
let someVideoMode = VideoMode()
//通過(guò)點(diǎn)(.)在引用成員變量
println("The width of someResolution is \(someResolution.width)")
//用法跟C類似,成員的成員
println("The width of someVideoMode is \(someVideoMode.resolution.width)")
//也可以直接對(duì)成員的成員賦值,這點(diǎn)跟OC有點(diǎn)區(qū)別
someVideoMode.resolution.width = 1280
println("The width of someVideoMode is now \(someVideoMode.resolution.width)")
請(qǐng)注意命名規(guī)則,類和結(jié)構(gòu)體定義時(shí),生成了一種新的swift數(shù)據(jù)類型,因此,其首字母應(yīng)該大寫,而其成員變量則是首字母小寫
結(jié)構(gòu)體實(shí)例聲明是可以直接根據(jù)其成員名形成的構(gòu)造函數(shù)初始化,而類不能使用這種方法
let vga = Resolution(width: 640, height: 480)
結(jié)構(gòu)體跟枚舉和其他基本類型一樣,都屬于值類型,即賦值操作是拷貝操作,而不是指針傳遞。
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
println("cinema is now \(cinema.width) pixels wide")
// 打印結(jié)果是 "cinema is now 2048 pixels wide"
println("hd is still \(hd.width) pixels wide")
// 打印結(jié)果是 "hd is still 1920 pixels wide",由此看見(jiàn),hd的值沒(méi)有隨cinema變化
但是類是引用變量(reference type),賦值后,兩個(gè)類變量將指向同一塊地址,類似于C的指針,但是不需要寫*。
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
//修改了alsoTenEighty后,原來(lái)的tenEighty的值也發(fā)生了變化
println("The frameRate property of tenEighty is now \(tenEighty.frameRate)")