標籤:
//*---------------------結構體-------------*/
//swift結構體也具有封裝的概念
//swift結構體比OC C語言裡面的結構體更加進了一步,裡面可以有方法,更接近我們的類
//結構體的定義格式 struct結構體名{成員變數}
struct rect {
var width:Double //按構造方法賦初值
var height:Double
//方法
func getHeightWidth() -> (x:Double,y:Double)//->傳回型別位元組
{
return(width,height)
}
func sumHeightWidth() -> (Double)
{
return(width+height)
}
}
//聲明結構體對象 var 變數名:結構體類型=結構體類型(參數)
//swift要求當定義一個結構體對象的時候,必須要對裡面的變數賦一個固定的值
//結構體的構造方法(就是建立了一個結構體對象,首先他要分配記憶體空間(這一步由系統自行幫我們完成),分配完記憶體就會立即調用我們的初始化方法(構造方法)來對變數賦初值)
//swift的結構體初始化方法有兩種 一種是成員逐一構造器var rect1:rect=rect(width: 100, height: 100) 一種是系統預設的不帶任何參數的初始化方法struct rect {
//var width:Double=0.0 //按構造方法賦初值
//var height:Double=0.0
//}
//var rect1:rect=rect()
var rect1:rect=rect(width: 100, height: 100)
println("\(rect1.width),\(rect1.height)")
//調用
var c_n=rect1.getHeightWidth()
println(c_n)
var w_h=rect1.sumHeightWidth()
println(w_h)
//結構體的整體賦值
var rect3 = rect1
//整體賦值後的可能性有兩種(1)rect3與rect1指向同一個記憶體空間(2)rect3與rect1內容一樣,記憶體空間不一樣
//驗證方法有兩種可以直接列印記憶體位址還有一種是改變值如果指向統一記憶體空間則賦值後的也應該改變成一樣
rect1.width = 20
println(rect1.width)
println(rect3.width)
//值未變可以知道是第二種 即賦值後內容一樣,記憶體空間不一樣
/*----------------------類-----------------*/
//類與結構體在定義的格式上沒有太大的區別,類在建立的時候必須要給裡面的變數附一個初始值,因為類與結構體不一樣,它沒有成員逐一構造器
class rectww {
var width:Double=0.0
var height:Double=0.0
}
var re:rectww=rectww()
println("\(re.width),\(re.height)")
//類的整體賦值
//指向同一記憶體空空間
var ss = re
re.width = 200
println(re.width)
println(ss.width)
//===恒等 !==不等 只能用類
if ss===re{
println("同一個類")
}
else
{
println("不同")
}
//儲存屬性
//常量儲存屬性 :只能在構造對象的時候改變值之後不被允許改變
//延遲儲存屬性
//結構體常量和類常量與儲存屬性的關係
//結構體常量常量對象,本身是一個常量,對應的屬性不可以通過修改它改變
struct person{
let name:NSString = "張三"//常量
var age:Int = 10//變數
}
let per:person=person(name: "李四", age: 20)//在構造對象的時候可以改變值之後不被允許改變 例如會報錯//per.name = "王五" //per.age = 39
println(per.name)
//類本身是一個常量,屬性可以通過修改它改變
class person1{
let name1:NSString = "張三"//常量
var age1:Int = 10//變數
}
let per1:person1=person1()//在構造對象的時候可以改變值之後不被允許改變 例如會報錯
//per1.name1 = "王五"
per1.age1 = 39
println(per1.name1)
//總結 結構體為值傳遞 類為引用
Swift 結構體和類