温馨提示:本文记录的知识点兼容Swift5.0
在 Swift 语言当中,一行代码就是一个完整的程序。
不用编写main函数,Swift将全局范围内的首句可执行代码作为程序入口。
一句代码尾部可以省略分号(;)
多句代码写到同一行时必须用分号(;)隔开。
打印
var badg = 12;
var number = 22;
// 使用 \(xxxx)进行插值
print("I am:\(number) He is: \(badg)")
print("I am :", badg, "you are:", number )
使用 let
来声明一个常量。不需要修改的,尽量定义成let
使用var
来声明一个变量。
值不要求在编译时期确定,但使用之前必须赋值1次。
常用数据类型:
Bool、Float、Double、String、Character
Array、Dictionary、Set
枚举类型Operation
- 字符串
Swift 的 String 和 Character 类型是完全兼容 Unicode 标准的。 Unicode是一个用于在不同书写系统中对文本进行编码、表示和处理的国际标准。它使你可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。
// 字符串的长度
let lentgh = string0.count
// 使用 + ,字符串拼接
var str0 = "I Love" + "You"
// 使用 == 进行字符串的比较
if str1 == str2 {
}
// 判断字符串是否为空
if str0.isEmpty {
}
// 遍历每一个字符
for cha in String0 {
print(cha)
}
// 字符串转 数字
let numString = "123"
let num = Int(numString) // num 被推测为类型 "Int?", 或者类型 "optional Int"
- 数组
let array = [1,2,3,4,5,6,7,8,9]
let num0 = array[0] // 或 array.first
// 声明数组属性
var datalist : [string] = []
var someInts = [Int]()
var arr0 : Array<Int> = Array()
// 重复元素的数组
var threeDoubles = Array(repeating: 0.0, count: 3)
// 遍历数组
for num in arr0 {
print(num)
}
// 判断数组是否为空
if arr0.isEmpty {
//...
}
// 是否包含某元素
if arr.contains("x") {
}
// 添加 删除元素
arr0.append("2") //在数组的末尾添加
arr0.append(contentsOf: ["3","4"])
arr0.insert("2", at: 1)
arr0.insert(contentsOf: ["3","4"], at: 0)
arr0.remove(at: 2)
// 数组可以相加(元素类型需一致)
var arr3 = arr1 + arr2
- 字典
字典是一种无序的集合,它存储的是键值对之间的关系,其所有键的值需要是相同的类型,所有值的类型也需要相同。一个字典的 Key 类型必须遵循 Hashable 协议
// [Key: Value]形式 定义 确定类型的 字典
var dic = [Int: String]()
let dic = [:] // 空字典
let dict = ["age":18, "height":100, "width":200]
// 键值类型 确定
var dic: [String: String] = ["YYZ": "Toronto", "DUB": "Dublin"]
// 键值对 个数
dic.count
// 字典是否为空
if dic.isEmpty {
}
// 更改
let dic1 = dic0.updateValue("Dublin", forKey: "DUB")
// 删除
dic["APL"] = nil
let dic1 = dic0.removeValue(forKey: "DUB")
// removeValue方法 在键值对存在的情况下,会移除该键值对并返回被移除的值;
// 在没有对应值的情况下,返回 nil:
// 遍历
for (key, value) in dic {
print("\(key): \(value)")
}
// 抽离 键值
let arr1 = [String](dic0.keys) // 返回数组
let arr2 = [String](dic0.values)
// 排序
dic.keys.sorted()
元组(tuples)
把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
// 定义元组,通过.0 或 .1来访问内部属性
let http404Error = (404,"网页不存在")
print(http404Error.0, http404Error.1)
// 定义元组,分别给元组内参数赋值,通过参数进行访问
let (statusCode, errorString) = (404,"网页不存在")
print(statusCode, errorString)
// 使用_,表示不赋值
let (statusCode1, _) = (404,"网页不存在")
print(statusCode1)
// 通过元组内部参数进行访问
let http200Status = (statusCode:200, statusString:"请求成功")
print(http200Status.statusCode, http200Status.statusString)
按照Swift标准库的定义,
Void
就是空元组`()
流程控制语句
var number = 22
if number == 0 {
print("ok!")
}else{
}
guard let location = "xxx" else {
// 如果条件不为真, 则执行 else 从句中的代码。
}
while number<3 {
print("ok!")
}
repeat {
print("ok!")
}while number<3
// for-in循环
let arr = ["Anna", "Alex", "Brian", "Jack"]
for name in arr {
print("Hello, \(name)!")
}
let dic = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in dic {
// 字典的内容理论上是无序的,遍历元素时的顺序是无法确定的
print("\(animalName)s have \(legCount) legs")
}
区间运算
闭区间[a,b]的表示:a...b
半开区间[a,b)的表示:a..<b
单侧区间[a,∞)的表示a...
区间类型ClosedRange、Range、PartialRangeThrough
let rang1: ClosedRange<Int> = 1...3;
let rang2: Range<Int> = 1..<3
let rang3: PartialRangeThrough<Int> = ...3
带间隔的区间
[0,2,4,6...100]的表示stride(from: 0, to: 100, by: 2)
for-in循环
//默认num是let 类型,可以省略
for num in 1...10{
print(num)
}
//如果要修改 num 的值,需要更改为var类型
for var num in 1...10 {
num += 100
print(num)
}
//不需要用到 num ,可以使用_缺省
for _ in 1...10 {
print("hello,world")
}
设置间隔的函数:stride(from:to:by:)
for tickMark in stride(from: 0, to: 60, by: 5) {
// 每5分钟渲染一个刻度线(0, 5, 10, 15 ... 45, 50, 55)
}
continue
语句,使本次循环结束,重新开始下次循环。
break
语句会 立刻结束整个控制流的执行。
区间运算与数组
let arr2 = ["aaa", "bbb", "ccc", "ddd"]
for str in arr2[1...2] {
print(str) //打印了bbb和ccc
}
switch语句
case、default
后面不能写{}
case
之后不必接break
每一个case
必须包含至少一条语句
case
允许同时判断多个条件
支持Character、String
类型
使用fallthrough
可以实现贯穿效果
let name = "c"
switch name {
case "c", "d": // 可以合并多个条件
print("ok")
case "a":
print("ok")
default:
break
}
可配合区间、元组
let num = 12
switch num {
case 1...10:
print("ok")
case 11...20:
break
default:
break
}
let point = (1, 1)
switch point {
case (0, 0):
print("the origin")
case (_, 0):
print("on the x")
case (0, _):
print("on the y")
case (-2...2, -2...2):
print("inside box")
default:
print("outside box")
}
值绑定:如果有一个值相同,另外一个则会自动绑定
let point1 = (1, 1)
switch point1 {
case (let x, 0):
// 将匹配一个y为 0 的点,并把这个点的横坐标赋给临时常量 x;
// 临时常量可在该case分支 里使用
print("在x轴")
case (0, let y):
print("在y轴")
case (let x, 1):
print("在x轴")
default:
print("outside of the box")
}
where关键字
用于判断某个条件满足,才会执行。
- 区间与where
[10,20,30...100]表示为1...100 where num % 10 == 0
for num in 1...100 where num % 10 == 0 {
print(num)
}
- 元组与where
??
let point2 = (1, 2)
// 判断point2的两个元素是否相等
switch point2 {
case let (x, y) where x == y:
print("ok")
case let (x, y) where x != y:
print("no")
default:
break
}
关键字 typealias
typealias
用来给类型 起别名
typealias Byte = Int8
typealias Short = Int16
typealias Long = Int64
typealias Date = (year: Int, month: Int, day: Int)
func test(_ date: Date) {
print(date.0)
print(date.year)
}
test((2011, 9, 10))