第九节:结构体-sturt
1 //: Playground - noun: a place where people can play 2 3 import UIKit 4 5 /* 6 swift学习第九节 7 结构体:sturt 8 */ 9 let centerX = 100.0 10 let centerY = 100.0 11 let distance = 200.0 12 //定义结构体sturt 13 struct Location { 14 var x : Double = 100 15 var y : Double = 200 16 17 //结构体初始化 18 init (StringPoint:String){ 19 let xy = StringPoint.characters.split(",") 20 x = atof(String(xy.first!)) 21 y = atof(String(xy.last!)) 22 23 } 24 init(x:Double,y:Double){ 25 self.x = x 26 self.y = y 27 } 28 init(){} 29 30 mutating func move2(dist:Double){ 31 self.x += dist 32 33 } 34 35 } 36 37 var pointA = Location(x: 100, y: 200) 38 let pointB = Location(StringPoint: "100,200") 39 let PointC = Location() 40 pointA.x 41 pointA.y 42 pointB.x 43 pointB.y 44 45 //把结构体作为参数传入 46 func inRange(point:Location) -> Bool { 47 let distX = point.x - centerX 48 let distY = point.y - centerY 49 let dist = sqrt(pow(distX, 2) + pow(distY,2)) 50 return dist < distance 51 } 52 inRange(pointA) 53 54 func move(dist:Double,inout point:Location){ 55 point.x += dist 56 } 57 move(100, point: &pointA) 58 pointA 59 pointA.move2(100.0) 60 61 //extension 扩展 62 extension Location { 63 mutating func move3(dist:Double){ 64 self.y += y 65 } 66 } 67 pointA.move3(100) 68 69 extension String { 70 func isEven() -> Bool { 71 return self.characters.count % 2 == 0 ? true : false 72 } 73 } 74 "An even string".isEven() 75 76 var copyPointA = pointA 77 copyPointA.y = 10000.0 78 pointA // struct 是值类型
第十节:
struct 和 class
1. class 必须有init()方法
struct 可以不写init()方法,默认有init方法
2. struct 为值类型
class 为引用类型
1 //: Playground - noun: a place where people can play 2 /* 3 swift学习第十节 4 struct 和 class 5 1. class 必须有init()方法 6 struct 可以不写init()方法,默认有init方法 7 2. struct 为值类型 8 class 为引用类型 9 10 */ 11 import UIKit 12 13 struct PointVal { 14 var x: Int 15 var y: Int 16 init(x:Int,y:Int){ 17 self.x = x 18 self.y = y 19 } 20 mutating func moveX(x:Int){ 21 self.x += x 22 } 23 } 24 class PointRef { 25 var x: Int 26 var y: Int 27 init(x:Int,y:Int){ 28 self.x = x 29 self.y = y 30 } 31 func moveX(x:Int){ 32 self.x += x 33 } 34 } 35 let p1 = PointVal(x: 0, y: 1) 36 let p2 = PointRef(x: 0, y: 2) 37 let p3 = PointRef(x: 0, y: 2) 38 // p1.x = 10 39 p2.x = 10 //这里,p1不能修改,但是p2可以修改.因为p2是引用类型,p1是值类型 40 if p2 === p3 { 41 print("他们是相同的对象") 42 } 43 if p2 !== p3{ 44 print("他们不是相同的对象") 45 } 46 47 var p4 = p1 48 p4.x = 10 49 p1.x 50 51 var p5 = p2 52 p5.x = 10 53 p2.x
第十一节:
函数式
内存泄露:循环引用
1 //: Playground - noun: a place where people can play 2 3 import UIKit 4 /* 5 swift学习第十一节 6 函数式 7 内存泄露:循环引用 8 9 */ 10 var number = [1,2,3,4,5,6] 11 var event = [Int]() 12 for n in number { 13 if n % 2 == 0{ 14 event.append(n) 15 } 16 } 17 event 18 19 let evens1 = number.filter({(n:Int) -> Bool in return n % 2 == 0}) 20 evens1 21 22 //-------------------------------内存管理-------------------- 23 class Person { 24 let name:String 25 init(name:String){ 26 self.name = name 27 print("\(name) 被构建") 28 } 29 deinit{ 30 print("\(name) 被销毁") 31 } 32 } 33 var ref1:Person? 34 var ref2:Person? 35 36 ref1 = Person(name: "Tom") //Person对象的引用计数为1 37 ref2 = ref1 //Person对象的引用计数为2 38 ref1 = nil //Person对象的引用计数为1 39 ref2 = nil //deinit()方法被执行 40 41 //循环引用造成的内存泄露 42 class Student { 43 let name:String 44 var apartment:School? 45 init(name:String){ 46 self.name = name 47 print("\(name)被创建") 48 } 49 deinit{ 50 print("\(name)被销毁"); 51 } 52 } 53 class School { 54 let unit: String 55 var tenant: Student? 56 init(unit:String){ 57 self.unit = unit 58 print("\(unit)被创建") 59 } 60 deinit{ 61 print("\(unit)被销毁") 62 } 63 } 64 var tom:Student? = Student(name: "TOM") 65 var apt11:School? = School(unit: "11") 66 67 //tom!.apartment = apt11 //这两句会造成循环引用 68 //apt11!.tenant = tom 69 70 tom = nil 71 apt11 = nil
第十二节:
reference cycle 的方式
1.使用weak 使用weak,不会造成引用计数+1,如果没有指向任何对象,则自动设置为nil
场景:双方均可以为空
2.umowned
场景:一方可以为空
1 //: Playground - noun: a place where people can play 2 /* 3 reference cycle 的方式 4 1.使用weak 使用weak,不会造成引用计数+1,如果没有指向任何对象,则自动设置为nil 5 场景:双方均可以为空 6 2.umowned 7 场景:一方可以为空 8 9 */ 10 11 12 import UIKit 13 14 //循环引用造成的内存泄露 15 class Student { 16 let name:String 17 var apartment:School? 18 init(name:String){ 19 self.name = name 20 print("\(name)被创建") 21 } 22 deinit{ 23 print("\(name)被销毁"); 24 } 25 } 26 class School { 27 let unit: String 28 weak var tenant: Student? 29 init(unit:String){ 30 self.unit = unit 31 print("\(unit)被创建") 32 } 33 deinit{ 34 print("\(unit)被销毁") 35 } 36 } 37 var tom:Student? = Student(name: "TOM") 38 var apt11:School? = School(unit: "11") 39 40 tom!.apartment = apt11 //这两句会造成循环引用 41 apt11!.tenant = tom 42 43 tom = nil 44 apt11 = nil
源码下载地址:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探