Swift面向对象基础(上)——Swift中的类和结构体(上)

学习来自《极客学院》

 1 import Foundation
 2 
 3 //1.定义类和结构体
 4 /*
 5 [修饰符]calss 类名{
 6     零到多个构造器
 7     零到多个属性
 8     零到多个方法
 9     零到多个下标
10 }
11 修饰符可以是:private public internal final
12 */
13 
14 /*定义结构体
15 [修饰符]struct 结构体名{
16 
17 }
18 修饰符可以是:private public internal
19 */
20 
21 /*
22 定义属性的语法
23 [修饰符] var或者let 存储属性名:类型名 = 初始值  <就是一般的变量声明和定义的方式>
24 */
25 
26 //类的创建以及实例的创建我懂,所以下面直接创建结构体,以及结构体的实例
27 struct dog{
28     var name:String
29     var age:Int
30     func run(){
31         println("(age)岁的(name)跑步中...")
32     }
33 }
34 var littledog:dog = dog(name: "小狗", age: 5)
35 littledog.run()
36 
37 //重点(结构体和类的区别):结构体是值类型,类是引用类型
38 
39 //内存里的对象可以有多个引用,即多个引用变量指向同一个对象,这个不用多说,下面就直接证明结构体是值类型
40 var bigdog = littledog
41 bigdog.name = "大狗"
42 bigdog.age = 9
43 bigdog.run()

运行结果:

Swift的一个代码(有关swift懒加载、使用了KVC定义模型):

  1 //
  2 //  Class.swift
  3 //  Swift的一个类
  4 //
  5 //  Created by HEYANG on 16/3/19.
  6 //  Copyright © 2016年 HEYANG. All rights reserved.
  7 //
  8 //  http://www.cnblogs.com/goodboy-heyang
  9 //  https://github.com/HeYang123456789
 10 //
 11 
 12 import Foundation
 13 
 14 class OneClass : NSObject{
 15     
 16    //=======属性+懒加载=======
 17     //如何自定义一个对象,而对象的属性如果又是基本数据类型,不建议设置为可选类型
 18     //而应该赋值为0,或者-1
 19     var value:Int = 0
 20     var string:String?
 21     var 闭包: (()->())? //声明一个闭包
 22     /* 
 23         懒加载的格式:
 24             lazy var 变量名称:数据类型 = 闭包()
 25             注意:闭包后面的()必须写,代表着执行闭包,将闭包的返回值赋值给变量
 26     */
 27     lazy var listData:[String]? = {
 28         () -> [String]
 29         in
 30         print("Hello world!")
 31         return ["hello","world"]
 32     }()
 33     // 如果在懒加载中,属性指明了类型,那么闭包中的前面两行就可以省略
 34     lazy var listData2:[String]? = {
 35         print("Hello world!")
 36         return ["hello","world"]
 37     }()
 38     // 如果实际开发中,懒加载的属性比较多,可以这么处理
 39     lazy var listData3:[String]? = self.test()
 40     // 由此可见,闭包就是一个特殊的函数
 41     func test() -> [String]{
 42         print("Hello world!")
 43         return ["hello","world"]
 44     }// 这函数部分可以统一放在别处
 45     
 46     // 开发中推荐的写法
 47     lazy var listData4 = {
 48         () -> [String]
 49         in
 50         print("Hello,world!")
 51         return ["Hello","World"]
 52     }()
 53     
 54     //=======构造方法=======
 55     override init() {
 56         value = 22
 57         string = "开心"
 58     }
 59     
 60     //=======自定义构造方法,并使用KVC=======
 61     init(value:Int,string:String) {
 62         // 初始化属性
 63         self.value = value
 64         self.string = string
 65     }
 66     
 67     init(dict: [String:AnyObject])
 68     {
 69         // 实现字典转模型,必须先手动调用调用父类init方法
 70         super.init()
 71         setValuesForKeysWithDictionary(dict)
 72     }
 73     
 74     // 如果利用KVC赋值,但是字典和模型的属性不能一一对应,就调用下面的方法
 75     override func setValue(value: AnyObject?,forUndefinedKey key:String){
 76         print("下面是[]的部分就是模型中找不到的属性:")
 77         print("[key:(key),value:(value)]")
 78     }
 79     //=======重写description属性=======
 80     override var description: String{
 81         // 优化
 82         let property = ["value","string"]//属性名
 83         let dictKeyValue = dictionaryWithValuesForKeys(property)
 84         return "(dictKeyValue)"
 85         
 86         //        return "Hello"
 87     }
 88     // 这个description就是属性,不过重写了简化的get方法,就是只读属性
 89 
 90 //    // 在Swift中只读属性称之为:计算型属性,它不具备存储性能
 91 //    // 下面是只读属性的一般写法
 92 //    var name:String
 93 //    {
 94 //        willSet{
 95 //            print(name)
 96 //            print(newValue)
 97 //        }
 98 //        didSet{
 99 //            print(name)
100 //            print(oldValue)
101 //        }
102 //    }
103 //    var name2:String
104 //    {
105 //        get{
106 //            return "只读属性"
107 //        }
108 //    }// 然后简写成
109 //    var name3:String
110 //    {
111 //        
112 //            return "只读属性"
113 //        
114 //    }
115     
116     
117     //=======析构方法=======
118     deinit{
119         
120     }
121 }
122 
123 //=======知识补充=======
124 
125 /*
126 声明闭包的时候
127     错误的写法:var 闭包: ()->()?
128     正确的写法:var 闭包: (()->())?
129 因为在"错误的写法:var 闭包: ()->()?"中,代表的是闭包的返回值是可选的,而不是闭包是可选的
130 
131 */

 源码下载:链接: http://pan.baidu.com/s/1skuEwWl 密码: 3psc

原文地址:https://www.cnblogs.com/goodboy-heyang/p/4649625.html