1 import Foundation 2 3 print("Hello, World!") 4 5 let a = 10 6 var b = 20 7 var c = a + b; 8 c = 3000 9 10 //重载:函数名相同, 函数类型不同(参数, 返回值不同), 构成重载, 调用的时候, 根据参数确定调用那个函数 11 func helloworld(a:Int)->Int { 12 return a * 100 13 } 14 func hellowold(a:String)->Int { 15 return 100 16 } 17 print(hellowold("123")) 18 19 //for 循环 20 //区间0...10 = [0, 10] 0..<10 = [0, 10) 21 for i in 0...10 { 22 print("i = (i)") 23 } 24 25 //1.枚举 26 //2.类 和 结构 27 28 //定义枚举值 29 enum Direction : String { 30 case East = "东" 31 case West = "西" 32 case South = "南" 33 case North = "北" 34 } 35 36 //定义变量接受枚举值 37 //如果给一个变量赋值过一次枚举值, 下次赋值可以直接使用.进行赋值 38 var dir = Direction.East 39 print(dir) 40 41 var dir2 = dir 42 dir = .North 43 print("dir = (dir.rawValue), dir2 = (dir2.rawValue)") 44 45 //枚举值的原始值 46 enum Season: Int{ 47 case Spring = 100 48 case Snmmer 49 case Fall 50 case Winter 51 } 52 53 var se = Season.Spring 54 //rawValue, 原始值 55 print(se.rawValue) 56 57 //通过枚举值的原始值找到枚举值 58 let sea = Season(rawValue: 100) 59 print(sea) 60 61 //隐式解析 62 if let s = sea { 63 print("s = (s)") 64 } else { 65 print("无法找到枚举值") 66 } 67 68 enum Student: String{ 69 case Primary = "小学" 70 case junior 71 case senior 72 case university 73 } 74 75 var stu = Student.Primary 76 print( stu.rawValue) 77 78 let student = Student(rawValue:"小学") 79 print(student) 80 81 if let st = student { 82 print("st = (st)") 83 } else { 84 print("无法找到枚举值") 85 } 86 87 88 enum FourFlower : String { 89 case 闯神 = "尼古拉斯·闯" 90 case 龙神 = "龙神" 91 case 宗主 = "宗主" 92 case 半张 = "半张" 93 } 94 95 let flower = FourFlower.闯神.rawValue 96 print("闯神(flower)") 97 98 //类 和 结构体 99 struct Person{ 100 var height = 1.8 101 var weight = 75 102 var age = 25 103 } 104 105 //实例结构体化 106 //()就是结构体的一个初始化方法 107 var 广恩 = Person() 108 print(广恩.weight) 109 广恩.weight = 90 110 print("广恩的体重 = (广恩.weight)KG") 111 112 113 //逐一构造器 114 //构造 = alloc...init = 初始化 115 //析构 = dealloc = 释放 116 var 康康 = Person (height: 178, weight: 70, age: 23) 117 118 let str = "康康的身高为(康康.height), 体重为(康康.weight)" + ", 年龄为(康康.age)" 119 print(str) 120 121 var 李阳 = 康康 122 康康.height = 180 123 print("李阳.height = (李阳.height)") 124 125 //类 126 class Student1{ 127 var num = 12345 128 var name = "万宝" 129 var GoodFriend = "闯神" 130 } 131 132 //系统没有给类自动添加逐一构造器 133 var 万少 = Student1() 134 万少.GoodFriend = "越南" 135 print(万少.GoodFriend) 136 137 var 龙神 = 万少 138 万少.GoodFriend = "Xcode" 139 print(龙神.GoodFriend) 140 141 //A = B 142 //值类型 : 赋值完成以后, B 修改, A不变. 枚举值 和 结构体就是值类型. 类似 copy 的过程 143 //引用类型 : 赋值完成以后, B 修改, A 随着 B 改变, 类就是引用类型. 类似 retain 的过程 144 145 //属性 146 //存储属性:用来存值和取值 147 //计算属性:计算属性的值通过 GET 方法, 用其他因素获取, set方法一般用来处理事务. 只写 GET, 这个属性是只读的; 不能只写 set 148 class Animal { 149 //存储属性 150 var type = "Elephant" 151 var weigh = 1000 152 //计算属性 153 var leg : Int { 154 get { 155 if type == "Elephant" { 156 return 4 157 } else if type == "bird" { 158 return 2 159 } else { 160 return 3 161 } 162 } 163 //set 方法需要一个 新值 参数 164 set(newValue){ 165 if(newValue >= 4){ 166 print("不可能是人") 167 } else { 168 print("有可能是人") 169 } 170 } 171 } 172 } 173 174 var per = Animal() 175 per.type = "老人" 176 print("per.leg = (per.leg)") 177 178 per.leg = 10 179 print("per.leg = (per.leg)") 180 181 //练习 182 //1.定义一个名字为rect的结构体 183 //2.属性包括 存储属性, x, y, with, height 计算属性 centerX, centerY 184 //3.centerX 和 centerY 由存储属性计算得出 185 //4.centerX 和 centerY 的 set 方法内分别依据 x/y 和 新值计算width/height 186 187 struct Rect { 188 189 //属性包括 存储属性, x, y, with, height 190 var x = 0.0 191 var y = 0.0 192 var width = 0.0 193 var height = 0.0 194 195 //在类内部使用属性的时候, 可以省略 self. 196 //只有涉及到参数名字和属性相同的时候, 建议加上 self.以示 197 198 //计算属性 centerX, centerY 199 var centerX :Double { 200 get{ 201 //centerX 和 centerY 由存储属性计算得出 202 return self.x + self.width/2.0 203 }set{ 204 //centerX 和 centerY 的 set 方法内分别依据 x/y 和 新值计算width/height 205 width = (newValue - x)*2 206 } 207 } 208 209 210 var centerY :Double { 211 get{ 212 return y + height/2.0 213 }set{ 214 height = (newValue - y)*2 215 } 216 } 217 218 } 219 220 221 //属性观察器 222 class Plant { 223 224 var type = "绿色植物"{ 225 willSet(newType) { 226 print("newType = (newType), 当前值(type)") 227 } didSet(oldType) { 228 print("oldType = (oldType), 当前值(type)") 229 } 230 } 231 232 var hasFlower : Bool = false { 233 willSet { 234 print("新值为(newValue), 当前值为(hasFlower)") 235 } didSet { 236 print("旧值为(oldValue), 当前值为(hasFlower)") 237 } 238 } 239 } 240 var appleTree = Plant() 241 appleTree.type = "苹果树" 242 appleTree.hasFlower = true 243 244 245 //类型属性 246 class Fruit { 247 //是否有皮 248 static var hasRind = true 249 } 250 251 print("水果是否有皮: (Fruit.hasRind)") 252 253 254 //方法 255 class Computer{ 256 var brand = "美帝良心想" 257 var price = 6888 258 func des(name:String){ 259 print("(name)买了(brand), 花了¥(price)") 260 } 261 } 262 var compu = Computer() 263 compu.des("闯神") 264 265 class Car { 266 var brand = "奥迪" 267 var color = "黑色" 268 func TYPE(name:String){ 269 print("(name)买了颜色为(color)的车, 牌子是(brand)") 270 } 271 } 272 var car = Car() 273 car.TYPE("外星人") 274 275 //继承 276 //定义父类 277 class Teacher { 278 var academic = "教授" 279 var offer = 8888 280 func teach(){ 281 print("某(academic)的薪资是(offer)") 282 } 283 284 //禁止被重写的方法 285 //final 禁止被重写的关键字 286 final func study(bookName:String){ 287 print("某(academic),刻苦钻研(bookName)") 288 } 289 290 var num : Int { 291 get { 292 return 100 293 } set { 294 295 } 296 } 297 298 299 } 300 301 //定义一个子类 302 //讲师 303 class Lecturer: Teacher { 304 var industry = "iOS" 305 //重写父类方法 306 //override 重写父类方法关键字 307 override func teach() { 308 //调用父类方法 309 super.teach() 310 print("从事行业是(industry)") 311 } 312 } 313 let lec = Lecturer() 314 lec.academic = "两院院士" 315 lec.teach() 316 lec.study("<<论持久战>>") 317 318 //重写属性 319 //把存储属性重写为计算属性 320 //不能把计算属性重写为存储属性 321 class ChildrenTeacher:Teacher { 322 override var offer: Int { 323 get{ 324 return 10000 325 } set { 326 327 } 328 } 329 // override var num = 100 330 } 331 332 //构造 333 //除了可选类型属性, 在构造过程中, 必须给各个属性赋初始值 334 class Hero{ 335 var age :Int? 336 var name : String 337 var equipment = "金箍棒" 338 var saddleHorse : String 339 init(){ 340 name = "孙悟空" 341 saddleHorse = "筋斗云" 342 } 343 //自定义一个构造方法 344 init(name:String, equipment:String, saddleHorse:String ){ 345 self.name = name 346 self.equipment = equipment 347 self.saddleHorse = saddleHorse 348 } 349 } 350 let 孙悟空 = Hero() 351 print(孙悟空.saddleHorse) 352 let 大禹 = Hero(name: "大禹", equipment: 孙悟空.equipment, saddleHorse: "11路公交") 353 354 class Film { 355 var name : String 356 var price : Float 357 var director : String 358 359 init (name:String, price:Float, director:String){ 360 self.name = name 361 self.price = price 362 self.director = director 363 } 364 func description(){ 365 print("电影名字(name), 价格为(price), 导演是(director)") 366 } 367 368 //遍历构造器 369 //和 OC 的不是一回事, OC的是 类方法 370 //convenience 在构造方法前添加 convenience代表当前构造器为便利构造器 371 //遍历构造器必须调用自身的指定构造器 372 convenience init(){ 373 self.init(name:"123", price:22, director:"王晶") 374 // name = "123" 375 // price = 22 376 // director = "王晶" 377 } 378 } 379 380 let 澳门风云三 = Film(name: "澳门风云三", price: 33, director: "尔冬升") 381 print(澳门风云三.price) 382 澳门风云三.description() 383 384 let 恶棍天使 = Film() 385 恶棍天使.description()