Swift-初级
Swift-初级
1 变量和常量
1.1. 变量(var)
提示: macOS Playground 中的另一行代码是
import Cocoa,它引入了 Apple 提供的大量代码,旨在简化应用开发
- 文本是用双引号括起来的
- Swift 确实允许使用分号,但非常少见——只有当你出于某种原因需要在同一行编写两段代码时才需要用到分号。
1
2
3
var name = "Ted"
name = "Rebecca"
name = "Keeley"
1.2. 常量(let)
如果可以,尽量使用常量而不是变量——这不仅能让 Swift 更好地优化你的代码,还能确保你永远不会意外地改变常量的值
1
2
3
let character = "Daphne"
// character = "Eloise" X
// let character = "Francesca" X
2 字符串("")
提示:Swift 中的字符串区分大小写
2.1. 基本字符串
- 双引号开头和结尾
- 标点符号、表情符号和其他字符
- 使用其他双引号,只要注意在它们前面加上反斜杠
1
2
3
4
let actor = "Denzel Washington"
let filename = "paris.jpg"
let result = "⭐️ You win! ⭐️"
let quote = "Then he tapped a sign saying \"Believe\" and walked away."
2.2. 多行字符串(""")
字符串两侧不是只用一组引号,而是用三组引号
1
2
3
4
5
let movie = """
A day in
the life of an
Apple engineer
"""
2.3. 字符串常用函数
xxx.count–属性1
print(actor.count)
xxx.isEmpty–属性1
print(movie.isEmpty)
xxx.uppercased()1
print(result.uppercased())
xxx.hasPrefix()1
print(movie.hasPrefix("A day"))
xxx.hasSuffix()1
print(filename.hasSuffix(".jpg"))
2.4. 字符串拼接
注意:不要过度使用
+
1 let luggageCode = "1" + "2" + "3" + "4" + "5"Swift 无法一次性连接所有这些字符串。它会先连接前两个字符串得到“12”,然后将“12”和“3”连接得到“123”,接着连接“123”和“4”得到“1234”,最后连接“1234”和“5”得到“12345”——它会创建临时字符串来存储“12”、“123”和“1234”,即使这些字符串在代码执行完毕后最终并没有被使用。
+1 2 3 4
let people = "Haters" let action = "hate" let lyric = people + " gonna " + action print(lyric)
不同类型相机是不允许的:x:
1 2 3 4
let number = 11 // let missionMessage = "Apollo " + number + " landed on the moon." // X let missionMessage = "Apollo " + String(number) + " landed on the moon." // or let missionMessage = "Apollo \(number) landed on the moon."
串插值(
\(xxx))1 2 3 4
let name = "Taylor" let age = 26 let message = "Hello, my name is \(name) and I'm \(age) years old." print(message)
3 整数(Int)
3.1. 基础
- 用下划线(
_)来随意分隔数字+=、-=、*=、/=
1
2
3
4
5
6
7
let reallyBig = 100_000_000 // or let reallyBig = 1_00__00___00____00
var counter = 10
counter = counter + 5
counter += 5
counter /= 2
print(counter)
print(9/2) // 4
3.2. 常用函数
n.isMultiple(of: m)n是否是m的倍数
1
print(120.isMultiple(of: 3)) // true
4 浮点数(Double)
精度并非 100%——在需要 100% 精度的情况下,例如处理货币时,不应该使用它们
1
2
let number = 0.1 + 0.2
print(number) // 0.30000000000000004
类型安全 :Swift 不允许我们意外地混合使用不同类型的数据
1
2
3
4
let a = 1
let b = 2.0
// let c = a + b //X
let c = a + Int(b) // or let c = Double(a) + b
CGFloat
1
2
3
var rating = 5.0
rating *= 2 //CGFloat // 2.0
print(rating) // 10.0
5 布尔值(Bool)
5.1. 基础
1
2
var isAuthenticated = false
isAuthenticated = !isAuthenticated
5.2. 常用函数
b.toggle():反转 =!b
6 数组(Array)
6.1. 基础
初始创建
var beatles = ["John", "Paul", "George", "Ringo"]var beatles : [String] = ["John", "Paul", "George", "Ringo"]var beatles = [String]()var beatles = Array<String>()
1 2 3 4 5 6
var beatles = ["John", "Paul", "George", "Ringo"] let numbers = [4, 8, 15, 16, 23, 42] var temperatures = [25.3, 28.2, 26.4] var scores = Array<Int>() scores.append(100) var albums = [String]()
取值
索引从0开始
提示: 请确保您请求的索引处存在项目,否则您的代码将崩溃——您的应用程序将停止工作。
1 2 3
print(beatles[0]) print(numbers[1]) print(temperatures[2])
添加新元素
arr.append(a)数组一次只能包含一种类型
1 2
beatles.append("Adrian") //temperatures.append("Chris") //X
6.2. 常用函数
arr.count:读取数组中元素的数量1
print(beatles.count)
arr.remove(at:n):删除元素1
beatles.remove(at: 2)
arr.removeAll():删除所有元素1
beatles.removeAll()
arr.contains():检查数组是否包含特定元素
1
beatles.contains("Ringo")
arr.sorted():对数组进行排序
1
beatles.sorted()
arr.reversed():反转数组 不再是一个简单的数组提示: Swift 在反转数组时非常智能——它实际上并不会重新排列所有元素,而是记住你想要反转元素的顺序。所以,当你打印出
reversedPresidents时,不要惊讶地发现它不再是一个简单的数组了!1 2 3
let presidents = ["Bush", "Obama", "Trump", "Biden"] let reversedPresidents = presidents.reversed() print(reversedPresidents)// ReversedCollection<Array<String>>(_base: ["Bush", "Obama", "Trump", "Biden"])
7 字典(Dictionary)
7.1. 基础
7.1.1. 创建
键-值对
1
2
3
4
5
6
let employee2 = [
"name": "Taylor Swift",
"job": "Singer",
"location": "Nashville"
]
print(employee2["name"]) //Optional("Taylor Swift")
直接打印Xcode会提示并警告 “它可能存在,也可能不存在”
Expression implicitly coerced from 'String?' to 'Any'
从字典中读取数据时,您可以提供一个默认值,以便在键不存在时使用
1
2
print(employee2["name"]) //Optional("Taylor Swift")
print(employee2["name", default: "Unknown"])
7.1.2. 显示创建
显式类型创建一个空字典
[String: Int]
1
2
3
4
var heights = [String: Int]()
heights["Yao Ming"] = 229
heights["Shaquille O'Neal"] = 216
heights["LeBron James"] = 206
7.1.3. 重复键-覆盖
由于字典中的每个元素都必须对应一个特定的键,因此字典不允许存在重复的键。相反,如果您为一个已存在的键设置值,Swift 会覆盖之前的值
1
2
3
4
5
var archEnemies = [String: String]()
archEnemies["Batman"] = "The Joker"
archEnemies["Superman"] = "Lex Luthor"
archEnemies["Batman"] = "Penguin"
print(archEnemies["Batman",default: "unkown"]) //Penguin
7.2. 常用方法
xxx.countxxx.removeAll()
8 集合(Set)
集合与数组类似,但不能添加重复项,而且集合中的元素没有特定的存储顺序
集合(Set)并非按照你指定的顺序存储元素,而是以一种高度优化的顺序存储,这使得查找元素的速度非常快
8.1. 创建集合
先创建一个数组,然后再将该数组放入集合中
1
let people = Set(["Denzel Washington", "Tom Cruise", "Nicolas Cage", "Samuel L Jackson"])
显示创建
xxx.insert(a)1 2 3 4 5
var people = Set<String>() people.insert("Denzel Washington") people.insert("Tom Cruise") people.insert("Nicolas Cage") people.insert("Samuel L Jackson")
8.2. 常用方法
xxx.countxxx.insert(a)xxx.contains(a)xxx.sorted():返回包含集合项目的排序数组
9 枚举(enum,enumeration)
枚举(enum,即 enumeration 的缩写)是一组命名值,我们可以在代码中创建和使用它们
Swift 很可能会使用单个整数(例如 0)来存储它,这比存储和检查字母 M、o、n、d、a、y 要高效得多
9.1. 创建
1
2
3
4
5
6
7
8
9
10
11
enum Weekday {
case monday
case tuesday
case wednesday
case thursday
case friday
}
// 使用
var day = Weekday.monday
day = Weekday.tuesday
day = Weekday.friday
当枚举中有很多个 case 时,你只需要写一次
case1 2 3
enum Weekday { case monday, tuesday, wednesday, thursday, friday }
可以在第一次赋值后省略枚举名称
Swift 知道
.tuesday必须指Weekday.tuesday,因为day必须始终是某种Weekda1 2 3
var day = Weekday.monday day = .tuesday day = .friday
10 类型注解
类型注解允许我们明确指定所需的数据类型
1
2
let surname: String = "Lasso"
var score: Int = 0
10.1. 常用类型注解
1
2
3
4
5
6
7
8
9
10
11
let playerName: String = "Roy"
var luckyNumber: Int = 13
let pi: Double = 3.141
var isAuthenticated: Bool = true
var albums: [String] = ["Red", "Fearless"]
// var teams: [String] = [String]()
// var cities: [String] = []
// var clues = [String]()
var user: [String: String] = ["id": "@twostraws"]
var books: Set<String> = Set(["The Bluest Eye", "Foundation", "Girl, Woman, Other"])
空数组创建
1 2 3
var teams: [String] = [String]() var cities: [String] = [] var clues = [String]()
枚举类型
Swift 能够在后续赋值中移除枚举名称,因此我们可以写成
style = .dark它知道任何新的style值都必须是某种UIStyle1 2 3 4 5
enum UIStyle { case light, dark, system } var style = UIStyle.light
常量赋值
1 2 3 4 5
let username: String // lots of complex logic username = "@twostraws" // lots more complex logic print(username)