Swift进阶
文章平均质量分 82
编译Swift源码,分析Swift的中间层语言SIL,底层LLVM IR。
Holothurian
千里之行跬步起、江海之成小流积。有志始知蓬莱近、无为总觉咫尺远。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
答一道面试题
放弃一个面试很容易、但总要对自己负责.于是花了一天写了一下.记录于此.随便写了个简易的框架,没有定制什么特殊的样式、就让他长这个样子吧。不打算详细说,只不过是拿出三年前自己写的项目摘取了下主要流程.原创 2023-04-29 20:19:46 · 223 阅读 · 0 评论 -
16、Swift 高阶函数
⾼阶函数的本质也是函数,有两个特点 接受函数或者是闭包作为参数 返回值是⼀个函数或者是闭包 这些函数我们常常⽤来作⽤于 Array , Set , Dictionary 中的每⼀个元素Map函数Map 函数作⽤于 Collection 中的每⼀个元素,然后返回⼀个新的 Collection 假设我们有⼀个 String 类型的 Array ,现在我们对集合当中的每⼀个元素都是⼩写的。⼀般我们的代码会这样写。let strings = ["APPLE","BANANA","CHERRY原创 2021-06-03 15:28:44 · 711 阅读 · 0 评论 -
15、Swift Collection
通过定义可以看到 Collection是继承于Sequence的: public protocol Collection: Sequence 。那么它就有Sequence的所有特性。 想要了解Collection协议的实现、我们先了解一下环形缓冲区: 环形缓冲区为首尾相连的结构 假如增加一个元素A、那么原有数据中的 BCDE元素位置都将后移一个位置。 同样删除这个元素A、那么原有数据中的BCDE元素位置都将往前移动一个位置。如果我们存储了ABCDE五个元素、那么插入的元素则在E之后的原创 2021-06-03 15:13:02 · 805 阅读 · 0 评论 -
14、Swift Sequence
在我们研究Sequence之前,我们先从我们⽇常⽐较常⻅的⼀段遍历数据的代码⼊⼿:let numbers = [2,4,6,8]for num in numbers{ print(num)}那么系统的底层是如何实现for...in,接下来我们通过SIL观察一下: // mainsil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>..原创 2021-06-03 15:05:07 · 543 阅读 · 0 评论 -
13、Swift Decodable源码解析
通过苹果Foundation库源码项目调试:swift-corelibs-foundation 查看一组JSON字符串和模型struct HSTeacher: Codable { var name: String var className: String var courceCycle: Int}let jsonString = """{ "name": "Holo", "className": "Swift", "courceCycle": 1...原创 2021-06-03 14:54:54 · 1261 阅读 · 1 评论 -
12、Swift Codable简单使用
一、简介大多数现代应用程序的共同点是,它们需要对各种形式的数据进行编码或解码。无论是通过网络下载的JSON数据,还是存储在本地的模型的某种形式的序列化表示形式,对于几乎任何Swift代码库而言,能够可靠地编码和解码不同的数据都是至关重要的。 这就是为什么Swift的Codable API是Swift 4.0的一部分时具有如此重要的新功能的重要原因-从那时起,它已成长为Apple平台上针对几种不同类型的编码和解码的标准,健壮的机制、平台以及服务器端Swift。Codable之所以如此出色,是因为它紧密集原创 2021-06-03 14:36:02 · 1978 阅读 · 0 评论 -
11、Swift访问控制
访问权限:在Swfit中主要是针对其他源文件和模块对代码的访问控制、 访问控制关键字:private、fileprivate、internal、public、open 权限大小:private < fileprivatre < internal < public < open一、private : 访问级别仅在当前定义的作⽤域内有效class HSTeacher{ private var age = 10 static let shareInstance ..原创 2021-05-27 23:26:23 · 952 阅读 · 1 评论 -
10、Swift闭包
一、闭包是⼀个捕获了上下⽂的常量或者是变量的函数。func testFunc() { print("test method")}上⾯的函数是⼀个全局函数,也是⼀种特殊的闭包,只不过当前的全局函数并不捕获值。 下面我们查看一个有内嵌函数的闭包func makeIncrementer() -> () -> Int { var runningTotal = 10 func incrementer() -> Int{ runningTot...原创 2021-05-27 23:01:07 · 1134 阅读 · 2 评论 -
9、Swift AnyObject、Any、AnyClass、T.self、T.type
AnyObject:代表任意类的实例,类的类型,仅类遵守的协议。 Any: 代表任意类型,包括Foundation 类型或者 Optional 类型 AnyClass 代表任意实例的类型: AnyObject.Type T.self,如果 T是实例对象,返回的就是它本身; T 是类,那么返回的是 Metadata T.Type:⼀种类型, T.self 是 T.Type 类型 type(of:) : ⽤来获取⼀个值的动态类型1.AnyObject:代表任意类的实例,类的类型,仅类遵守的协议。原创 2021-05-27 22:17:35 · 952 阅读 · 0 评论 -
8、Swift Runtime
下面我们对Swift的Runtime进行探究、先看纯Swift案例class HSTeacher { var age:Int = 20 var name:String = "Holo" func teachMethod1() { print("teach Method1") } func teachMethod2() { print("teach Method2") }}let t = HSTeacher()func...原创 2021-05-25 14:01:26 · 762 阅读 · 2 评论 -
7、Swift循环引用
闭包一般默认捕获我们外部的变量,下面查看案例var age = 20let closure = { age += 1}closure() print(age)//21从输出结果来看:闭包内部对变量的修改将会改变外部原始变量的值。 下面我们来看闭包在类对象中的使用、通过反初始化器deinit来查看当前实例对象是否被回收(同OC中的dealloc)class HSTeacher { var age = 28 deinit { print("is de...原创 2021-05-25 13:35:00 · 574 阅读 · 1 评论 -
6、Swift内存管理
Swift中内存管理使⽤⾃动引⽤计数(ARC)机制来追踪和管理内存。下面我们来看强引用案例class HSTeacher{ var age:Int = 29 var name:String = "Hellon"}var t = HSTeacher()var t1 = tvar t2 = t print("end") //断点控制台在断点时、输出t变量的地址、然后格式化输出地址得(lldb) po t<LGTeacher: 0x1006523d0>...原创 2021-05-25 13:19:21 · 949 阅读 · 3 评论 -
5、Swift指针
1.Swift中指针分为两类: Raw Pointer 未指定数据类型指针(原生指针)--> UnsafeRawPointer Type Pointer 指定数据类型指针 --> UnsafePointer 下面我们来看Swift中的指针和OC中指针的对应关系 Swift Object-C 说明 UnsafePointer<T> const T* 指针及所指向的内容都不可变 UnsafeMutable...原创 2021-05-25 12:54:06 · 631 阅读 · 3 评论 -
3、Swift 结构体初始化、值类型、引用类型、mutating&inout
一、结构体初始化结构体的初始化:结构体不需要自定义初始化方法 如果我们的属性有默认初始值,编译器会提供不同的初始化⽅法 如果我们自定义初始化方法,编译器则不会帮我们生成初始化方法1.结构体不需要自定义初始化方法因为编译器在结构体中⾃动帮组我们合成了初始化⽅法:通过SIL分析可以看到、所以我们在创建对象时得这样进行初始化调⽤:否则编译器报错2.如果我们的属性有默认初始值,编译器会提供不同的初始化⽅法SIL分析3.如果我们自定义初始化...原创 2021-05-25 12:17:14 · 1509 阅读 · 1 评论 -
4、Swift 结构体与类的方法调度方式
一、结构体的方法调度直接引入struct的案例、我们来查看结构体的方法调用、macOS -- Command Line Tools新建 main.swift文件struct LGStack{ func teach() { print("teach method") }}var t = LGStack()//函数调用方式t.teach() //断点在我们的断点处、我们开启显示汇编代码 (Xcode-- Debug - Debug Workflow - Al...原创 2021-05-25 12:37:53 · 633 阅读 · 1 评论 -
2、Swift存储属性、属性观察者、延迟属性、类型属性
一、存储属性1、创建一个类并声明两个变量、而这两个变量皆为存储属性:由篇1得:8字节为metadata、8字节为refCounts;age占用8字节、age2占用8字节、当前对象 t 地址输出可得当前变量存储值0x0000000000000012 --> 18 0x000000000000001c --> 282、属性误区:不可在set方法中调用自身、否则会造成递归调用、程序崩溃计算属性不占用内存空间通过分析SIL文件我们查看下计算属性的本质class S.原创 2021-05-25 11:29:05 · 1014 阅读 · 1 评论 -
Swift进阶汇总
1、Swift编译流程、SIL分析、创建对象分析、类结构探索原创 2021-05-25 10:54:07 · 592 阅读 · 0 评论 -
1、Swift编译流程、SIL分析、创建对象分析、类结构探索
Swift编译流程及SIL分析1、iOS开发的语⾔不管是 OC 还是 Swift 后端都是通过 LLVM 进⾏编译的:Object-C 通过 前端编译器 Clang + 后端编译器 LLVM --> .o Swift 通过 前端编译器 Swift + 后端编译器 LLVM --> .o在此过程中: OC 通过 Clang 编译器编译成IR,然后再⽣成可执⾏⽂件.o(这⾥也就是我们的机器码) 。 Swift 通过 Swift 编译器 编译成IR,然后再⽣成...原创 2021-05-25 10:45:38 · 1815 阅读 · 0 评论
分享