- 作者: Liwx
- 邮箱: 1032282633@qq.com
- 源码: 需要
源码
的同学, 可以在评论区
留下您的邮箱
iOS Swift 语法
底层原理
与内存管理
分析 专题:【iOS Swift5语法】00 - 汇编
01 - 基础语法
02 - 流程控制
03 - 函数
04 - 枚举
05 - 可选项
06 - 结构体和类
07 - 闭包
08 - 属性
09 - 方法
10 - 下标
11 - 继承
12 - 初始化器init
13 - 可选项
目录
- 00-Playground
- 01-Playground简单使用
- 02-新建子Playground Page
- 01-HelloWorld
- 02-UIView
- 03-UIImageView
- 04-UITableViewController
- 05-注释
- 06-Markup
- 07-常量
- 08-标识符
- 09-常见数据类型
- 10-字面量
- 11-类型转换
- 12-元组(Tuple)
00-Playground
Playground
是 Apple 在 2014 年 WWDC 发布 Swift 的时候,和 Xcode 一起发布的用于实时调试 Swift 代码的小工具。
本专题中【iOS Swift5语法】的大部分代码都通过 Playground 来演示,它可以实时的为我们编译代码,并自动的显示每一行代码的结果,他能演示很多代码场景。Playground是我们学习 Swift 一个必不可少的的利器。
【iOS Swift5语法】 专题使用的Xcode版本已更新至Xcode最新版本Xcode 11.4.1
。
01-Playground简单使用
-
Playground快捷键
- 显示侧边栏:
Command + 1
- 隐藏侧边栏:
Command + 0
-
Playground
可以快速预览代码效果
,是学习语法的好帮手 -
Command + Shift + Enter
:运行整个Playground -
Shift + Enter
:运行截止到某一行代码
- 显示侧边栏:
新建Playground
运行Xcode, 选中顶部菜单File -> New -> Playground ...
02-新建子Playground Page
-
新建
子Playground Page
-
选中PlaygroundTest,右键选择
New Playground Page
重命名子Playground Page为
01-HelloWorld
-
- Playground文件目录说明
01-HelloWorld
-
不用编写main函数
, Swift将全局范围内的首句可执行代码作为程序入口 - 一句代码尾部可以
省略分号(;)
,多句代码
写到同一行时必须用分号(;)隔开
- 用
var定义变量
,let定义常量
,编译器能自动推断
出变量\常量的类型
print("Hello World!")
let a = 10
let b = 20
var c = a + b
c += 30
02-UIView
使用UIKit框架需要导入
UIKit
框架,import UIKit
PlaygroundSupport
框架支持实时预览
UI效果,需要实时预览UI效果需导入PlaygroundSupport
框架,import PlaygroundSupport
import UIKit
import PlaygroundSupport
let view = UIView()
view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
view.backgroundColor = .blue
PlaygroundPage.current.liveView = view
03-UIImageView
- 导入图片资源文件
Logo.png
拖拽图片文件到Resources
文件夹下
import UIKit
import PlaygroundSupport
let imageView = UIImageView(image: UIImage(named: "Logo"))
PlaygroundPage.current.liveView = imageView
04-UITableViewController
import UIKit
import PlaygroundSupport
let vc = UITableViewController()
vc.view.backgroundColor = .lightGray
// TODO: live设置为vc就可以了
PlaygroundPage.current.liveView = vc
05-注释
- 单行注释
// 单行注释
- 多行注释
/*
多行注释
*/
- 多行注释嵌套
/*
1
/* 多行注释的嵌套 */
2
*/
06-Markup
- Playground的注释支持
markup
语法(与markdown
相似) -
开启markup
渲染效果:Editor -> Show Rendered Markup
-
关闭markup
渲染效果:Editor -> Show Raw Markup
注意: Markup只在Playground中有效
//: 开始markup
/*:
开始markup
*/
/*:
# 一级标题
## 无序列表
- First Item
- Second Item
## 有序列表
1. First Item
2. Second Item
## 笔记
> This is a note.
---
## 图片
![Logo](Logo.png "Local image")
## 链接
* [博客](https://www.jianshu.com/u/bfcdf4a76abf)
## 粗体/斜体
这是**Bold**, 这是*Italic*
*/
07-常量
常量即在
初始化赋值之后
,就不允许
在进行赋值
let age1 = 10
//age1 = 22 // 报错: Cannot assign to value: 'age1' is a 'let' constant
let age2: Int
age2 = 20
func getAge() -> Int {
return 30
}
let age3 = getAge()
- 常量、变量在
未初始化之前
都不能使用
let age: Int
var height: Int
print(age) // error: constant 'age' used before being initialized
print(height) // error: variable 'height' used before being initialized
声明常量后再单独赋值,必须指定类型
let age
age = 20 // error: found an unexpected second identifier in constant declaration; is there an accidental break?
08-标识符
- 标识符(比如
常量名、变量名、函数名
)几乎可以使用任何字符
- 标识符
不能以数字开头
,不能包含空白字符
、制表符
、箭头
等特殊字符
func 🐂🍺() {
print("666")
}
🐂🍺()
let 👽 = "ET"
var 🥛 = "milk"
09-常见数据类型
常用数据类型分为两大类:
值类型
和引用类型
-
值类型
- 枚举(enum)
- Optional
- 结构体(struct)
- Bool、Int、Float、Double、Character
- String、Array、Dictionary、Set
- 枚举(enum)
-
引用类型(reference type)
- 类(class)
- 整数类型: 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位
10-字面量
// 布尔
let bool = true // 取反是false
// 字符串
let string = "哈哈哈"
// 字符(可存储ASCII字符、Unicode字符)
let character: Character = "🐂"
// 整数
let intDecimal = 17 // 十进制
let intBinary = 0b10001 // 二进制
let intOctal = 0o21 // 八进制
let intHexadecimal = 0x11 // 十六进制
- 整数和浮点数可以
添加额外的零
或者添加下划线
来增强可读性
100_0000、1_000_000.000_000_1、000123.456
// 浮点数
let doubleDecimal = 125.0 // 十进制,等价于1.25e2, 0.0125等价于1.25e-2
let doubleHexadecimal1 = 0xFp2 // 十六进制,意味着15x2^2, 相当于十进制60.0
let doubleHexadecimal2 = 0xFp-2 // 十六进制, 意味着15x2^-2, 相当于十进制的3.75
/* 以下都是表示12.1875
十进制: 12.1875、1.21875e1
十六进制: 0xC.3p0
*/
// 数组
let array = [1, 3, 5, 7, 9]
// 字典
// value值有整型,字符串类型,需指定类型为[String : Any], 否则报错Heterogeneous collection literal could only be inferred to '[String : Any]'; add explicit type annotation if this is intentional
let dictionary: [String : Any] = ["age" : 18, "height" : 168, "weight": 120, "name" : "Liwx"]
11-类型转换
注意:
Swift不支持不同类型的值进行运算
// 整数类型
let int1: UInt16 = 2_000
let int2: UInt8 = 1
let int3 = int1 + UInt16(int2)
// 整数、浮点数转换
let int = 3
let double = 0.14159
let pi = Double(int) + double
let intPi = Int(pi)
// 字面量可以直接相加,因为数字字面量本身没有明确的类型
let result = 3 + 0.14159
12-元组(Tuple)
元组(Tuple)
可以把多个值组合成一个复合值
。元组内的值可以是任意类型
,且不要求是相同类型。
-
不想接收值
,直接用下划线_
- 可以使用
标签方式
// 元组
let http404Error = (404, "Not Found")
print("The status code is \(http404Error.0), status message is \(http404Error.1)")
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode), status message is \(statusMessage)")
// 不想接收值,直接用下划线_
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 使用标签方式
let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode), description is \(http200Status.description)")
iOS Swift 语法
底层原理
与内存管理
分析 专题:【iOS Swift5语法】