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