ABI
ABI 应用程序和操作系统之间的二进制接口
涉及的内容有 目标文件格式 数据类型的大小/布局/对齐 函数调用约定等等
LLVM 作为编译器的后端 生成对应平台的二进制代码
OC Swift区别
OC Swift
- OC 编译器的前端是Clang LLVM 是编译器的后端 生成对应平台的二进制代码
- Swift 编译器的前端是swiftc 进行词法分析 生成语法树 LLVM 是编译器的后端 生成对应平台的二进制代码
swiftc 位置
swiftc 存放在在Xcode内部
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc
swiftc 操作
- 生成语法树 swiftc -dump-ast main.swift 语法树结果直接生成在终端
swiftc -dump-ast main.swift -o main.ast 会把语法树结果生成在main.ast文件内
- 生成最简洁的SIL代码 swiftc -emit-sil main.swift
- 生成LLVM IR代码 swiftc -emit-ir main.swift -o main.ll
- 生成汇编代码 swiftc -emit-assembly main.swift -o main.s
对汇编代码进行分析 可以真正掌握编程语言的本质
Swift
- 不用编写main函数 Swift将全局范围内首句可执行代码作为程序的入口
- 一句代码尾部可以省略分号 多句代码写在同一行必须要用分号进行分割
- 用var声明变量 用let声明常量 编译器能够自动推断出变量/常量的类型
- playground可以快速预览代码校验效果
command + shif + Enter 运行Playground
shift + enter 运行截止到某一行代码
playground
PlaygroundPage.current.liveView = MyViewController()
展示界面
注释
嵌套注释
/*
1
/* 多行注释 */
2
*/
playground注释支持markup语法(与markdown相似)
单行开启markup
//:
多行开启markup
/*:
# 一级标题
*/
markup只在playground中有效
> This is a note

内置跳转不同playground的方法
//:[下一页](@next)
//:[上一页](@previous)
常量
- 只能赋值一次
- 他的值不要求在编译时期确定 但是使用之前必须赋值一次
常量 变量在初始化之前 不能使用
标识符
- 标识符(比如常量名 变量名 函数名) 几乎可以使用任何字符
- 标识符不能以数字开头 不能包含空白字符 制表符 箭头等特殊字符
常见数据类型

- 整数类型 Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64
- 在32bit平台 Int等价于Int32 在64bit平台 Int等价于Int64
- 整数的最值 UInt8.max Int16.min
- 一般情况下 都是直接使用Int即可
- 浮点类型 Float 32位 精度只有6位 Double 64位 精度最少15位
字面量
字符类型的时候必须指定类型名称Character 否则会认为是字符串类型
字符可存储ASCII字符 和 Unicode字符
let char: Character = "3"

类型转换
字面量可以直接相加 因为数字字面量本身是没有明确的类型
元祖 tuple
let http404Error = (404,"Not Found")
http404Error.0
http404Error.1
let (statusCode,statusMessage) = http404Error
statusCode
statusMessage
let (justTheStatusCode,_) = http404Error
justTheStatusCode
let http200Status = (statusCode:200, statusMessage:"ok")
http200Status.statusCode
http200Status.statusMessage
网友评论