swift中類與結構體

寫了12個Person來複習,不過完成一樣的代碼須要敲鍵盤的次數相比OC確實少了不少,這不少應該歸功於Swift中不寫分號,以及少了OC中的中括號。java

1、類與結構體數組

二者在Swift中差不了多少了函數

 

類與結構體有不少相同的地方: (第2,3點是其餘語言中不存在的)spa

1)均可以定義屬性/方法/下標(結構體也能夠定義方法了).net

2)都能初始化(經過構造方法)code

3)都能使用擴展(extension)與協議(protocol)對象

 

4)類與結構體(枚舉)中的全局屬性/方法:在類中用class關鍵字,但在結構體中用staticblog

 

類比結構體多的功能:繼承

1)能繼承ip

2)運行時能檢查類對象的類型

3)析構釋放資源

4)引用計數容許一個類實例有多個引用

 

[java]  view plain  copy
 
  1. class Person1{  
  2.     var name = "jack"  
  3. //    class var height:Int = 10   //錯誤! 類中不能有全局存儲屬性的, 只能是計算屬性. 見下文說明  
  4. }  
  5.   
  6. struct Person2{   //結構體更像Java中的類  
  7.     var age:Int  
  8. //    static var height:Int = 10  //能夠設定全局屬性, 須要初始化.  
  9. }  
  10.   
  11. //1.1實例化類與結構, 默認構造器  
  12. let p1 = Person1()  
  13. let p2 = Person2(age: 10)  //當使用默認構造器時, 必須初始化裏面全部的屬性  

 

 

2、屬性(存儲屬性--計算屬性--類屬性)

 

2.1存儲屬性: 就是存儲一個常量或變量,相似Java中的成員變量

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. class Person3{  
  2.     var name:String = "xuneng"  //須要手動初始化  
  3.     var age:Int = 10  
  4.     let height = 175  
  5.     lazy var p1:Person1 = Person1() //延遲, 必須是var  
  6. }  
  7.   
  8. var p3 = Person3()  
  9. p3.name   //經過點語法來訪問  
  10. p3.age = 11   //設置  
  11.   
  12. //延遲lazy存儲屬性: 當使用改屬性時才進行初始化, 好處是避免空間浪費  
  13. println(p3.p1)   //這句調用時, p1才進行初始化  

 

2.2計算屬性: 不直接存儲值,而是用get/set來作.可用來操做其餘屬性值的變化

get: 取, 用來封裝取值的過程

set: 設, 用來封裝設值的過程

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. class Person4{  
  2.     var name:String = "jack"  
  3.     var jjLength:Int = 10  
  4.     var age:Int{  //只能是var  
  5.         get{  
  6.             return jjLength * 2  
  7.         }  
  8.         set(newAge){  
  9.             jjLength = newAge / 2  
  10.         }  
  11.     }  
  12. }  
  13. var p4 = Person4()  
  14. p4.age = 10   //當設age爲10時,jjLength變爲5  

 

 

2.2.1 簡便的計算屬性寫法

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. //默認參數newValue, 表示新賦給的值  
  2. class Person5{  
  3.     //用newValue  
  4.     var jjLength:Int = 10  
  5.     var age:Int{  //只能是var  
  6.         get{  
  7.             return jjLength * 2  
  8.         }  
  9.         set{  
  10.             jjLength = newValue / 2  
  11.         }  
  12.     }  
  13.       
  14.     //只讀計算屬性  
  15.     var height:Int{  
  16.         get{  
  17.             return jjLength * 4  
  18.         }  
  19.     }  
  20.       
  21.     var height2:Int{  //只讀直接能夠省略get  
  22.         return jjLength * 4  
  23.     }  
  24. }  
  25.   
  26. var p5 = Person5()  
  27. p5.height  
  28. //p5.height = 10  //只讀的不能賦值  



2.2.2 注意計算屬性的死循環狀況

計算屬性的值是不固定的,所以不能用let修飾,只能用var

計算屬性不能直接賦值

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. class Person6{  
  2.     //用newValue  
  3.     var jjLength:Int = 10  
  4.       
  5. //    var height2:Int = 10{  //不能直接賦值, 不然成存儲屬性了  
  6. //        return jjLength * 4  
  7. //    }  
  8.       
  9.     var age:Int{  
  10.         get{  
  11.             return age   //死循環.  age會調用get方法  
  12.         }  
  13.         set{  
  14.            age = newValue    //死循環.  age設值時會調用set方法  
  15.         }  
  16.     }  
  17. }  

 

 

2.3 類屬性(或者叫作類型屬性)用class關鍵字修飾.類屬性只能是計算屬性.

類屬性就是相似java中static修飾的屬性.一個類只有一份,且多個實例對象共享.可直接用類名調用

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. class Person7{  
  2.     class var name:String{  
  3.         return "xuneng"  
  4.     }  
  5. }  
  6. Person7.name  

 

2.4 屬性監視器: 可用來監視屬性變化的2個方法willSet, didSet

計算屬性由於有get和set方法,所以監視器其實對計算屬性沒多大用處.對存儲屬性用處大

初始化值時, 不會調用willSet與didSet

willSet, didSet和set, get不能共存

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. class Person8{  
  2.     var name:String = "xuneng"{  
  3.         willSet{  
  4.             println("新值爲:\(newValue)")    //newValue新值  
  5.         }  
  6.         didSet{  
  7.             println("新值爲:\(oldValue)")   //oldValue表示舊值  
  8.         }  
  9.     }  
  10. }  
  11. var p8 = Person8()  
  12. p8.name = "jack"    //這句調用  


3、函數與方法

 

 

3.1 對象方法

類中的方法與函數的一點區別: 方法的第一個參數之後,全是外部參數.名字即爲參數名

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. class Person9{  
  2.     func sum(num1:Int , num2:Int){  
  3.         println(num1 + num2)  
  4.     }  
  5. }  
  6. var p9 = Person9()  
  7. p9.sum(10, num2: 10)  //第一個參數之後, 全是外部參數. 至關於加了#  

 

3.2 類方法. 用class修飾

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. class Person10{  
  2.     class func sum(num1:Int , num2:Int){  
  3.         println(num1 + num2)  
  4.     }  
  5. }  
  6. Person10.sum(10, num2: 10)  

 

 

3.3 self與super, 與OC相同

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. class Person11{  
  2.     func sum(num1:Int , num2:Int){  
  3.         self.fun()   //對象方法調用對象方法, 類方法調用類方法  
  4.     }  
  5.       
  6.     func fun(){  
  7.         println("hello")  
  8.     }  
  9. }  


4、下標(附屬腳本)

 

下標, 有的叫附屬腳本(subscript), 新東西。

能夠定義在 類/結構體/枚舉中,進行快速訪問。

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. //格式:也能夠設定set/get  
  2. /* 
  3. subscript(index:Int) -> Int{ 
  4.     get{ 
  5.          
  6.     } 
  7.     set{ 
  8.          
  9.     } 
  10. */  

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
    1. struct Person12{   //官方不少用的結構體  
    2.     let jjLength:Int      //結構體在這裏能夠不初始化  
    3.       
    4.     subscript(index:Int) -> Int{  
    5.         return jjLength * index  
    6.     }  
    7. }  
    8.   
    9. var p12 = Person12(jjLength: 10)  
    10. p12[3]     //直接像訪問數組同樣訪問.  根據jj長度,index爲3,值爲30  
相關文章
相關標籤/搜索