iOS激情詳解之Swift (四)
阿新 • • 發佈:2019-02-05
<span style="font-size:18px;">// 結構體和類 // 在swift中,結構體被做了很多強化,幾乎所有的資料型別都是用結構體實現的 // 相同點; 1,都可以定義變數,2.都可以定義方法3,都可以定義構造器 init 4.都可以遵守協議5.擴充套件 // 不同點: 1.結構體是值型別.類是引用型別 2.類可以被繼承 3.類可以使用型別推斷4.類可以使用deinirt (析構器) 5, 一個類可以有多個引用 // 結構體 struct Resolution { // 定義變數 (屬性) var height = 0 var width = 0 } // 結構體自動根據屬性生成構造器 (init方法) let resolution = Resolution(height: 10, width: 20) resolution.height resolution.width // 類 class Video { var resolution_class = Resolution(height: 20, width: 20) var frameRate = 0.1 } // 類不會自動生成構造器,需要我們手動實現 let video = Video() video.frameRate = 0.2 // 值型別 和引用型別的區別 var newResolution = resolution newResolution.height = 55 newResolution.height resolution.height var newVideo = video video.frameRate newVideo.frameRate = 0.5 newVideo.frameRate video.frameRate </span>
<span style="font-size:18px;">// 構造器 struct ResolutionA { var height = 0 var width = 0 // 構造器 系統生成self.屬性名 用與賦值 init(gao:Int , kuan:Int){ self.height = gao self.width = kuan } } let resolution2 = ResolutionA(gao: 10, kuan: 10) resolution2.height class VideoA { var frameRate = 0.2 var resolution_VA = ResolutionA(gao: 20, kuan: 10) // 構造器會自動生成外部引數名 構造器內實現對屬性的賦值操作 init(frame:Double, resolu_VA:ResolutionA) { self.frameRate = frame self.resolution_VA = resolu_VA } } let videoA = VideoA(frame: 0.2, resolu_VA: resolution2) </span>
<span style="font-size:18px;">// 屬性分兩種 計算屬性和儲存屬性 // 儲存屬性:儲存類和結構體類裡面的常量或變數,只起到儲存作用 // 計算屬性:不作為儲存功能使用 計算屬性本身提供 get set 方法 間接的獲取計算屬性的值 struct Point { var x = 0 // 儲存屬性 var y = 0 // 儲存屬性 } struct Size { var width = 100 // 儲存屬性 var height = 100 // 儲存屬性 } // var point = Point (x: 0, y: 0) // 代表正方形 struct Rect { // var point_z = Point(x: 0, y: 0) // 計算屬性 var size = Size(width: 100, height: 100) // 計算屬性 取值時呼叫get方法 var center:Point { set {// set方法中自動生成newValue, 代表賦給的新值 // 平移 對x進行改變 let x = newValue.x - size.width/2 let y = newValue.y - size.height/2 point_z.x = x point_z.y = y } get{ // 在get方法中,用於獲取屬性的值 let centerX = point_z.x + size.width/2 let centerY = point_z.y + size.width/2 return Point(x: centerX, y:centerY) } } } // 呼叫 var rect = Rect(point_z: Point(x:0, y:0), size: Size(width: 100, height: 100)) rect.center.x // get rect.center = Point(x: 500, y: 500) // set 賦值 rect.point_z.x // 定義方法 struct ResolutionB { var height = 0 var width = 0 // 結構體定義方法 // 結構體方法預設不能對結構體屬性做更改,如果有更改需求,需要使用mutating關鍵字對方法進行修飾 mutating func hello() { print("您好!") // 再巢狀一個 func hello2() { print("您好!!") } self.width = 20 } // 類似於 + 方法 靜態方法 static func helloWord() { print("helloWord") // width = 20 } } // 呼叫 var resolution4 = ResolutionB() resolution4.hello() ResolutionB.helloWord() class VideoB { var frameRate = 0.1 // 類裡面的普通方法可以對類的屬性做更改 func dj(){ print("打不死的小強") frameRate = 0.2 } //+方法 func djj() { print("打死雙姐") } // 型別屬性,只能是計算屬性,只實現get方法,也就是隻讀 class var name: String { get { return "東方旭日" } } } // 呼叫 var video3 = VideoB() video3.dj() video3.djj() VideoB.name</span>