From 2175ce624150e23af878bdeae9dec664c14cb3c1 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Mon, 17 Oct 2022 19:45:37 +0800 Subject: [PATCH] feat: add `swift.md`. --- README.md | 1 + docs/css.md | 12 +- docs/swift.md | 1536 ++++++++++++++++++++++++++++++++++++++ scripts/assets/swift.svg | 3 + 4 files changed, 1546 insertions(+), 6 deletions(-) create mode 100644 docs/swift.md create mode 100644 scripts/assets/swift.svg diff --git a/README.md b/README.md index 288b68f7..a65aceba 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Quick Reference [Golang](./docs/golang.md) [JSON](./docs/json.md) [Markdown](./docs/markdown.md) +[Swift](./docs/swift.md) [TOML](./docs/toml.md) [YAML](./docs/yaml.md) diff --git a/docs/css.md b/docs/css.md index 3c6efac2..6bc0c836 100644 --- a/docs/css.md +++ b/docs/css.md @@ -251,12 +251,12 @@ p:first-child { 选择器 | 说明 :- | :- -`div.classname` | 具有特定类名的 Div -`div#idname` | 具有特定 ID 的 Div -`div p` | div中的段落 -`div > p` | 所有 p 个标签
_div 深处的一层_ -`div + p` | div 之后的 P 标签 -`div ~ p` | div 前面的 P 标签 +`div.classname` | 具有特定类名的 div +`div#idname` | 具有特定 ID 的 div +`div p` | div 中的段落 +`div > p` | div 子节点中的所有 `P` 标签 +`div + p` | div 之后的 `P` 标签 +`div ~ p` | div 前面的 `P` 标签 另见: [相邻兄弟](https://developer.mozilla.org/zh-CN/docs/Web/CSS/Adjacent_sibling_combinator) / [通用兄弟](https://developer.mozilla.org/zh-CN/docs/Web/CSS/General_sibling_combinator) / [子](https://developer.mozilla.org/zh-CN/docs/Web/CSS/Child_combinator) 选择器 diff --git a/docs/swift.md b/docs/swift.md new file mode 100644 index 00000000..8c828289 --- /dev/null +++ b/docs/swift.md @@ -0,0 +1,1536 @@ +Swift 备忘清单 +=== + +该备忘单提供了使用 [Swift](https://www.swift.org) 的示例,涵盖 Swift 基础知识、控制流、类型、结构/类、运算符、函数方法等。 + +入门 +--- + +### 变量 + + +```swift +var score = 0 // 变量 +let pi = 3.14 // 常数 + +var greeting = "Hello" +var numberOfToys = 8 +var isMorning = true + +var numberOfToys: Int = 8 +numberOfToys += 1 +print(numberOfToys) // 打印 "9" +``` + +### 类型注释 + +```swift +var greeting: String = "Hello" +var numberOfToys: Int = 8 +var isMorning: Bool = true +var price: Double = 8.99 +``` + +### 算术运算符 + + + - `+` 添加 + - `-` 减法 + - `*` 乘法 + - `/` 分配 + - `%` 余数 + + +---- + +```swift +var x = 0 +x = 4 + 2 // x 现在是 6 +x = 4 - 2 // x 现在是 2 +x = 4 * 2 // x 现在是 8 +x = 4 / 2 // x 现在是 2 +x = 4 % 2 // x 现在是 0 +``` + +#### 复合赋值运算符 + +```swift +var numberOfDogs = 100 +numberOfDogs += 1 +print("有 \(numberOfDogs) 个斑点狗!") +// 打印: 有 101 个斑点狗! +``` + +---- + +- `+=` 添加和分配总和 +- `-=` 减去并分配差值 +- `*=` 乘并赋值 +- `/=` 除并分配商 +- `%=` 除并分配余数 + + +### 字符串插值 + +```swift +var apples = 6 +print("I have \(apples) apples!") +// 打印: I have 6 apples! +``` + +### 多行字符串 + +```swift +let myLongString = """ +Swift? +这是我最喜欢的语言! +""" +``` + +### 代码注释 + +```swift +// 这一行表示 Swift 中的注释。 +/* +这都被注释掉了。 +没有一个会跑! +*/ +``` + +### 组成一个元组 + + +```swift +let player = ("Maya", 5, 150) + +print(player) // ("Maya", 5, 150) +print("\(player.0): level \(player.1), \(player.2) pts") // Maya: level 5, 150 pts +``` + +### 分解元组 + +```swift +let player = (name: "Maya", level: 5) +let (currentName, curLevel) = player +print("\(currentName): level \(curLevel)") +// 打印: Maya: level 5 +``` + +### 特殊注释语法 (MARK) + +```swift +// MARK: - 查看设置 +``` + +`MARK` 可用于在栏中显示评论 + +### 特殊注释语法 (TODO) + +```swift +// TODO: 更新逻辑以适应数据更改 +``` + +`TODO` 用于显示需要完成的事情的提醒 + +### 特殊注释语法 (FIXME) + +```swift +// FIXME: 修复对现有条目进行更改时的故障行为 +``` + +`FIXME` 用于显示需要修复的内容的提醒 + +变量 +---- + +### 变量声明 + +变量用 `var` 声明: + +```swift +var greeting = "你好" +var numberOfToys = 8 +var isMorning = true +``` + +为了清楚起见,变量声明可以包含类型注释: + +```swift +var greeting: String = "你好" +var numberOfToys: Int = 8 +var isMorning: Bool = true +``` + +变量是可变的。 它们的值可以改变: + +```swift +var numberOfToys: Int = 8 +numberOfToys += 1 +print(numberOfToys) // 打印“9” +``` + +### 常数 + +常量用 `let` 声明: + +```swift +let greeting = "Hello" +let numberOfToys = 8 +let isMorning = true +``` + +为清楚起见,常量声明可以包含类型注释: + +```swift +let greeting: String = "Hello" +let numberOfToys: Int = 8 +let isMorning: Bool = true +``` + +常量是不可变的。它们的值不能改变: + +```swift +让 numberOfToys: Int = 8 +numberOfToys += 1 +// ❌ 错误:numberOfToys 不可变 +``` + +### 计算变量(get 和 set) + + +```swift +import Foundation + +let df = DateFormatter() +df.dateFormat = "d MMMM yyyy" + +var birth = df.date(from: "5 June 1999")! + +var age: Int { + Calendar.current + .dateComponents([.year], + from: birth, + to: Date()).year! +} + +print(age) // 20 +birth = df.date(from: "5 June 2002")! +print(age) // 17 +``` + +在下面的示例中,distanceInFeet 有一个 `getter` 和一个 `setter`。 因为有 `setter`,所以 `getter` 需要关键字 `get`: + +```swift +var distanceInMeters: Float = 100 + +var distanceInFeet: Float { + get { + distanceInMeters * 3.28 + } + set(newDistance) { + distanceInMeters = newDistance / 3.28 + } +} + +print(distanceInMeters) // 100.0 +print(distanceInFeet) // 328.0 + +distanceInFeet = 250 +print(distanceInMeters) // 76.21951 +print(distanceInFeet) // 250.0 + +distanceInMeters = 800 +print(distanceInMeters) // 800.0 +print(distanceInFeet) // 2624.0 +``` + +### willSet + + +```swift +var distance = 5 { + willSet { + print("距离将被设置") + } +} + +distance = 10 // 打印: 距离将被设置 +``` + +可以在 `willSet` 中访问新值: + +```swift +var distance = 5 { + willSet(newDistance) { + print("距离将被设置 \(newDistance)") + } +} + +distance = 10 // 打印: 距离将被设置 10 +``` + +`willSet` 可用于在设置变量值之前执行一些代码 + +### didSet + +```swift +var distance = 5 { + didSet { + print("距离设置为 \(distance)") + print("它的旧值是: \(oldValue)") + } +} +distance = 10 // 打印: 距离将被设置 10 + // 打印: 它的旧值是:5 +``` + +### willSet 和 didSet + +```swift +var distance = 5 { + willSet(newDistance) { + print("距离将设置为 \(newDistance)") + } + didSet { + print("距离设置为 \(distance)") + print("它的旧值是: \(oldValue)") + } +} +distance = 10 +``` + +条件和逻辑 +--- + +### if 语句 + +```swift +var halloween = true +if halloween { + print("不给糖就捣蛋!") +} +// 打印: 不给糖就捣蛋! +if 5 > 3 { + print("5 大于 3") +} else { + print("5 不超过 3") +} +// 输出: "5 大于 3" +``` + +### else 语句 + +```swift +var turbulence = false + +if turbulence { + print("请坐好。") +} else { + print("你可以自由地四处走动。") +} +// 打印: 你可以自由地四处走动。 +``` + +### else if 语句 + +```swift +var weather = "rainy" +if weather == "sunny" { + print("拿点防晒霜") +} else if weather == "rainy" { + print("拿一把雨伞") +} else if weather == "snowing" { + print("穿上你的雪地靴") +} else { + print("无效天气") +} +// 打印: 拿一把雨伞 +``` + +### 比较运算符 + +```swift +5 > 1 // true +6 < 10 // true +2 >= 3 // false +3 <= 5 // true +"A" == "a" // false +"B" != "b" // true +``` + +- `<` 小于 +- `>` 大于 +- `<=` 小于或等于 +- `>=` 大于或等于 +- `==` 等于 +- `!=` 不等于 + + +### 三元条件运算符 + +```swift +var driverLicense = true + +driverLicense + ? print("驾驶座") : print("乘客座位") +// 打印: 驾驶座 +``` + +### switch 语句 + +```swift +var secondaryColor = "green" + +switch secondaryColor { + case "orange": + print("红色和黄色的混合") + case "purple": + print("红色和蓝色的混合") + default: + print("这可能不是辅助颜色") +} +// 打印: 蓝色和黄色的混合 +``` + +### switch 语句:区间匹配 + +```swift +let year = 1905 +var artPeriod: String + +switch year { + case 1860...1885: + artPeriod = "印象派" + case 1886...1910: + artPeriod = "后印象派" + default: + artPeriod = "未知" +} +// 打印: 后印象派 +``` + +### switch 语句:复合案例 + +```swift +let service = "Seamless" + +switch service { + case "Uber", "Lyft": + print("旅行") + case "DoorDash", "Seamless", "GrubHub": + print("餐厅送餐") + case "Instacart", "FreshDirect": + print("杂货配送") + default: + print("未知服务") +} +// 打印: 餐厅外卖 +``` + +### switch 语句:where 子句 + +```swift +let num = 7 + +switch num { + case let x where x % 2 == 0: + print("\(num) 是偶数") + case let x where x % 2 == 1: + print("\(num) 奇数") + default: + print("\(num) 无效") +} + +// 打印: 7 奇数 +``` + +### 逻辑运算符! + +```swift +!true // false +!false // true +``` + +### 逻辑运算符 && + +```swift +true && true // true +true && false // false +false && true // false +false && false // false +``` + +### 逻辑运算符 || + +```swift +true || true // true +true || false // true +false || true // true +false || false // false +``` + +### 组合逻辑运算符 + +```swift +!false && true || false // true +``` + +`!false && true` 首先计算并返回 `true` 然后,表达式,`true` || `false` 评估并返回最终结果 `true` + +```swift +false || true && false // false +``` +`true && false` 首先计算返回 `false` 然后,表达式,`false` || `false` 评估并返回最终结果 `false` + +### 控制执行顺序 + +```swift +// 没有括号: +true || true && false || false +// ----> true + +// 带括号: +(true || true) && (false || false) +// ----> false +``` + +### 简单的 guard + +```swift +func greet(name: String?) { + guard let unwrapped = name else { + print("Hello guest!") + return + } + print("Hello \(unwrapped)!") +} +greet(name: "Asma") // 输出:Hello Asma! +greet(name: nil) // 输出:Hello guest! +``` + +循环 +---- + +### 范围 + +```swift +let zeroToThree = 0...3 +// zeroToThree: 0, 1, 2, 3 +``` + +### stride() 函数 + +```swift +for oddNum in stride(from: 1, to: 5, by: 2) { + print(oddNum) +} +// 打印: 1 +// 打印: 3 +``` + +### for-in 循环 + +```swift +for char in "hehe" { + print(char) +} +// 打印: h +// 打印: e +// 打印: h +// 打印: e +``` + +### continue 关键字 + +```swift +for num in 0...5 { + if num % 2 == 0 { + continue + } + print(num) +} +// 打印: 1 +// 打印: 3 +// 打印: 5 +``` + +`continue` 关键字将强制循环继续进行下一次迭代 + +### break 关键字 + +```swift +for char in "supercalifragilistice" { + if char == "c" { + break + } + print(char) +} +// 打印: s +// 打印: u +// 打印: p +// 打印: e +// 打印: r +``` + +### 使用下划线 + +```swift +for _ in 1...3 { + print("Olé") +} +// 打印: Olé +// 打印: Olé +// 打印: Olé +``` + +### while 循环 + +```swift +var counter = 1 +var stopNum = Int.random(in: 1...10) + +while counter < stopNum { + print(counter) + counter += 1 +} +// 循环打印,直到满足停止条件 +``` + +`while` 循环接受一个条件,并在所提供的条件为 `true` 时持续执行其主体代码。如果条件从不为假,则循环将继续运行,程序将陷入`无限循环` + +数组和集合 +---- + +### Array 数组 + +```swift +var scores = [Int]() +// 数组为空:[] +``` + +### .count 属性 + +```swift +var grocery = ["🥓", "🥞", "🍪", "🥛", "🍊"] +print(grocery.count) +// 打印: 5 +``` + +### 索引 + + +索引是指项目在有序列表中的位置,使用下标语法 `array[index]` 从数组中检索单个元素。 + +```swift +var vowels = ["a", "e", "i", "o", "u"] + +print(vowels[0]) // 打印: a +print(vowels[1]) // 打印: e +print(vowels[2]) // 打印: i +print(vowels[3]) // 打印: o +print(vowels[4]) // 打印: u +``` + +注意:Swift 数组是零索引的,这意味着第一个元素的索引为 0。 + +### 用数组字面量初始化 + +```swift +// 使用类型推断: +var snowfall = [2.4, 3.6, 3.4, 1.8, 0.0] +// 明确类型: +var temp: [Int] = [33, 31, 30, 38, 44] +``` + +### .append() 方法和 += 运算符 + +```swift +var gymBadges = ["Boulder", "Cascade"] +gymBadges.append("Thunder") +gymBadges += ["Rainbow", "Soul"] +// ["Boulder", "Cascade", "Thunder", +// "Rainbow", "Soul"] +``` + +### .insert() 和 .remove() 方法 + +```swift +var moon = ["🌖", "🌗", "🌘", "🌑"] +moon.insert("🌕", at: 0) +// ["🌕", "🌖", "🌗", "🌘", "🌑"] + +moon.remove(at: 4) +// ["🌕", "🌖", "🌗", "🌘"] +``` + +### 遍历数组 + +```swift +var employees = ["小王", "张三", "王五"] +for person in employees { + print(person) +} +// 打印: 小王 +// 打印: 张三 +// 打印: 王五 +``` + +### 集合(Set) + +```swift +var paintingsInMOMA: Set = [ + "The Dream", + "The Starry Night", + "The False Mirror" +] +``` + +我们可以使用集合(`Set`)来存储相同数据类型的`唯一`元素 + +### 空集合(Set) + +```swift +var team = Set() + +print(team) +// 打印: [] +``` + +### 填充集合 + +```swift +var vowels: Set = ["a", "e", "i", "o","u"] +``` + +要创建一个填充有值的集合,请在赋值运算符之前使用 `Set` 关键字。 + +### .insert() + +```swift +var cookieJar: Set = [ + "Chocolate Chip", + "Oatmeal Raisin" +] +// 添加一个新元素 +cookieJar.insert("Peanut Butter Chip") +``` + +### .remove() 和 .removeAll() 方法 + +```swift +var oddNumbers: Set = [1, 2, 3, 5] + +// 移除现有元素 +oddNumbers.remove(2) +// 删除所有元素 +oddNumbers.removeAll() +``` + +### .contains() + +```swift +var names: Set = ["Rosa", "Doug", "Waldo"] +print(names.contains("Lola")) //打印: false + +if names.contains("Waldo"){ + print("There's Waldo!") +} else { + print("Where's Waldo?") +} +// 打印: There's Waldo! +``` + +### 迭代一个集合 + +```swift +var recipe: Set = ["蛋", "面粉", "糖"] + +for ingredient in recipe { + print ("在配方中包含\(ingredient)") +} +``` + +### .isEmpty 属性 + +```swift +var emptySet = Set() +print(emptySet.isEmpty) // 打印: true + +var populatedSet: Set = [1, 2, 3] +print(populatedSet.isEmpty) // 打印: false +``` + +### .count 属性 + +```swift +var band: Set = ["张三", "王五", "赵六"] + +print("乐队有 \(band.count) 名演奏者。") +// 打印: 乐队有 4 名演奏者。 +``` + +### .intersection() 交叉 + +```swift +var setA: Set = ["A", "B", "C", "D"] +var setB: Set = ["C", "D", "E", "F"] + +var setC = setA.intersection(setB) +print(setC) // 打印: ["D", "C"] +``` + +### .union() 合并去重 + +```swift +var setA: Set = ["A", "B", "C", "D"] +var setB: Set = ["C", "D", "E", "F"] + +var setC = setA.union(setB) +print(setC) +// 打印: ["B", "A", "D", "F", "C", "E"] +``` + +### .symmetricDifference() 对称差 + +```swift +var setA: Set = ["A", "B", "C", "D"] +var setB: Set = ["C", "D", "E", "F"] + +var setC = setA.symmetricDifference(setB) +print(setC) +// 打印: ["B", "E", "F", "A"] +``` + +### .subtracting() 减法 + +```swift +var setA: Set = ["A", "B", "C", "D"] +var setB: Set = ["C", "D"] + +var setC = setA.subtracting(setB) +print(setC) +// 打印: ["B", "A"] +``` + +字典 +--- + +### 基础字典 + +```swift +var dictionaryName = [ + "Key1": "Value1", + "Key2": "Value2", + "Key3": "Value3" +] +``` + +成对数据或键值对的`无序`集合 + +### Keys + +```swift +var fruitStand = [ + "Coconuts": 12, + "Pineapples": 12, + "Papaya": 12 +] +``` + +每个`键`都是`唯一`的,即使它们都包含相同的`值` + +### 类型一致性 + +```swift +var numberOfSides = [ + "triangle": 3, + "square": 4, + "rectangle": 4 +] +``` + +仅包含 `String` 键和 `Int` 值 + +### 初始化填充字典 + +```swift +var employeeID = [ + "Hamlet": 1367, + "Horatio": 8261, + "Ophelia": 9318 +] +``` + +### 初始化一个空字典 + +```swift +// 初始化器语法: +var yearlyFishPopulation = [Int: Int]() + +// 空字典字面量语法: +var yearlyBirdPopulation: [Int: Int] = [:] +``` + +### 添加到字典 + +```swift +var pronunciation = [ + "library": "lai·breh·ree", + "apple": "a·pl" +] +// 新键:“programming”,新值:“prow·gra” +pronunciation["programming"] = "prow·gra" +``` + +### 删除键值对 + + +```swift +var bookShelf = [ + "Goodnight": "Margaret Wise Brown", + "The BFG": "Roald Dahl", + "Falling Up": "Shel Silverstein", + "No, David!": "David Shannon" +] + +// 通过将 key 设置为 nil 来删除值 +bookShelf["The BFG"] = nil + +// 使用 .removeValue() 删除值 +bookShelf.removeValue(forKey: "Goodnight") + +// 删除所有值 +bookShelf.removeAll() +``` + +### 修改键值对 + + +```swift +var change = [ + "Quarter": 0.29, + "Dime": 0.15, + "Nickel": 0.05 +] + +// 使用下标语法更改值 +change["Quarter"] = .25 + +// 使用 .updateValue() 更改值 +change.updateValue(.10, forKey: "Dime") +``` + +要更改键值对的值,请使用 `.updateValue()` 方法或下标语法,通过将括号 `[ ]` 和其中的现有键附加到字典的名称,然后添加赋值运算符 _(`=`)_ 后跟修改后的值 + +### .isEmpty 属性 + +```swift +var bakery = [String:Int]() + +// 检查字典是否为空 +print(bakery.isEmpty) // 打印 true +bakery["Cupcakes"] = 12 +// 检查字典是否为空 +print(bakery.isEmpty) // 打印 false +``` + +### .count 属性 + +```swift +var fruitStand = [ + "Apples": 12, + "Oranges", 17 +] +print(fruitStand.count) // 打印: 2 +``` + +### 为变量赋值 + +```swift +var hex = [ + "red": "#ff0000", + "yellow": "#ffff00", + "blue": "#0000ff", +] + +print("蓝色十六进制代码 \(hex["blue"])") +// 打印: 蓝色十六进制代码 Optional("#0000ff") + +if let redHex = hex["red"] { + print("红色的十六进制代码 \(redHex)") +} +// 打印: 红色的十六进制代码 #ff0000 +``` + +将键值对的值分配给变量将返回一个可选值。要提取值,请使用可选的展开 + +### 遍历字典 + +```swift +var emojiMeaning = [ + "🤔": "Thinking Face", + "😪": "Sleepy Face", + "😵": "Dizzy Face" +] +// 遍历键和值 +for (emoji, meaning) in emojiMeaning { + print("\(emoji)被称为'\(meaning)Emoji'") +} +// 仅通过键迭代 +for emoji in emojiMeaning.keys { + print(emoji) +} +// 仅通过值迭代 +for meaning in emojiMeaning.values { + print(meaning) +} +``` + +函数 +--- + +### 基础函数 + +```swift +func washCar() -> Void { + print("Soap") + print("Scrub") + print("Rinse") + print("Dry") +} +``` + +### 调用函数 + +```swift +func greetLearner() { + print("欢迎来到 Quick Reference!") +} +// 函数调用: +greetLearner() +// 打印: 欢迎来到 Quick Reference! +``` + +### 返回值 + +```swift +let birthYear = 1994 +var currentYear = 2020 + +func findAge() -> Int { + return currentYear - birthYear +} + +print(findAge()) // 打印: 26 +``` + +### 多个参数 + + +```swift +func convertFracToDec(numerator: Double, denominator: Double) -> Double { + return numerator / denominator +} + +let decimal = convertFracToDec(numerator: 1.0, denominator: 2.0) +print(decimal) // Prints: 0.5 +``` + +### 省略参数标签 + +```swift +func findDiff(_ a: Int, b: Int) -> Int { + return a - b +} + +print(findDiff(6, b: 4)) // 打印: 2 +``` + +### 返回多个值 + + +```swift +func smartphoneModel() -> (name: String, version: String, yearReleased: Int) { + return ("iPhone", "8 Plus", 2017) +} + +let phone = smartphoneModel() + +print(phone.name) // 打印: iPhone +print(phone.version) // 打印: 8 Plus +print(phone.yearReleased) // 打印: 2017 +``` + +### Parameters & Arguments + +```swift +func findSquarePerimet(side: Int) -> Int { + return side * 4 +} + +let perimeter = findSquarePerimet(side: 5) +print(perimeter) // 打印: 20 + +// Parameter: side +// Argument: 5 +``` + +### 隐式返回 + +```swift +func nextTotalSolarEclipse() -> String { + "April 8th, 2024 🌎" +} + +print(nextTotalSolarEclipse()) +// 打印: April 8th, 2024 🌎 +``` + +### 默认参数 + +```swift +func greet(person: String = "guest") { + print("Hello \(person)") +} +greet() // Hello guest +greet(person: "Aliya") // Hello Aliya +``` + +### 输入输出参数 + + +```swift +var currentSeason = "冬天" + +func season(month: Int, name: inout String) { + switch month { + case 1...2: + name = "冬天 ⛄️" + case 3...6: + name = "春天 🌱" + case 7...9: + name = "夏天 ⛱" + case 10...11: + name = "秋天 🍂" + default: + name = "未知" + } +} + +season(monthNum: 4, name: ¤tSeason) + +print(currentSeason) // 春天 🌱 +``` + +### 可变参数 + +```swift +func totalStudent(data: String...) -> Int { + let numStudents = data.count + return numStudents +} + +print(totalStudent(data: "王五", "张三")) +// 打印: 2 +``` + +### 可选参数 + +```swift +func getFirstInitial(from name: String?) -> String? { + return name?.first +} +``` + +函数可以接受可选类型并返回可选类型。当一个函数不能返回请求类型的合理实例时,它应该返回 `nil` + +结构 +---- + +### 结构创建 + +```swift +struct Building { + var address: String + var floors: Int + + init(address: String, floors: Int) { + self.address = address + self.floors = floors + } +} +``` + +结构或结构用于以编程方式在代码中表示现实生活中的对象。结构是使用 `struct` 关键字创建的,后跟其名称,然后是包含其属性和方法的主体 + +### 默认属性值 + +```swift +struct Car { + var numOfWheels = 4 + var topSpeed = 80 +} + +var reliantRobin = Car(numOfWheels: 3) + +print(reliantRobin.numOfWheels) // 打印: 3 +print(reliantRobin.topSpeed) // 打印: 80 +``` + +### 结构实例创建 + +```swift +struct Person { + var name: String + var age: Int + + init(name: String, age: Int) { + self.name = name + self.age = age + } +} + +// Person 实例: +var morty = Person(name: "张三", age: 14) +``` + +### init() 方法 + + +```swift +struct TV { + var size: Int + var type: String + + init(size: Int, type: String) { + self.size = size + self.type = type + } +} +``` + +使用 `TV` 类 + +```swift +var newTV = TV(size: 65, type: "LED") +``` + +### 检查类型 + +```swift +print(type(of: "abc")) // 打印: String +print(type(of: 123)) // 打印: 123 +``` + +### 变异方法(mutating) + + +```swift +struct Menu { + var menuItems = ["Fries", "Burgers"] + mutating func addToMenu(dish: String) { + self.menuItems.append(dish) + } +} +``` + +使用 `Menu` 类 + +```swift +var dinerMenu = Menu() +dinerMenu.addToMenu(dish: "Toast") +print(dinerMenu.menuItems) +// 打印: ["Fries", "Burgers", "Toast"] +``` + +### 结构方法 + +```swift +struct Dog { + func bark() { + print("Woof") + } +} +let fido = Dog() +fido.bark() // 打印: Woof +``` + +Class +---- + +### 引用类型(类) + + +```swift +class Player { + var name: String + + init(name: String) { + self.name = name + } +} + +var player1 = Player(name: "Tomoko") +var player2 = player1 +player2.name = "Isabella" + +print(player1.name) // Isabella +print(player2.name) // Isabella +``` + +### 类的实例 + +```swift +class Person { + var name = "" + var age = 0 +} + +var sonny = Person() +// sonny 现在是 Person 的一个实例 +``` + +### init() 方法 + + +```swift +class Fruit { + var hasSeeds = true + var color: String + + init(color: String) { + self.color = color + } +} +``` + +使用 Fruit 类 + +```swift +let apple = Fruit(color: "red") +``` + +可以使用 `init()` 方法和相应的初始化属性来初始化类,在 `init()` 方法中,`self` 关键字用于引用类分配属性值的实际实例 + +### 类属性 + +```swift +var ferris = Student() + +ferris.name = "Ferris Bueller" +ferris.year = 12 +ferris.gpa = 3.81 +ferris.honors = false +``` + +### 继承 + + +假设我们有一个 BankAccount 类: + +```swift +class BankAccount { + var balance = 0.0 + func deposit(amount: Double) { + balance += amount + } + func withdraw(amount: Double) { + balance -= amount + } +} +``` + +`SavingsAccount` 继承 `BankAccount` 类 + +```swift +class SavingsAccount: BankAccount { + var interest = 0.0 + + func addInterest() { + let interest = balance * 0.005 + self.deposit(amount: interest) + } +} +``` + +新的 `SavingsAccount` 类(子类)自动获得了 `BankAccount` 类(超类)的所有特征。 此外,`SavingsAccount` 类定义了一个 `.interest` 属性和一个 `.addInterest()` 方法。 + +### 示例 + +使用数据类型 + +```swift +class Student { + var name: String + var year: Int + var gpa: Double + var honors: Bool +} +``` + +使用默认属性值 + +```swift +class Student { + var name = "" + var gpa = 0.0 + var honors = false +} +``` + +### 这是结构定义和类定义的示例 + +```swift +struct Resolution { + var width = 0 + var height = 0 +} +class VideoMode { + var resolution = Resolution() + var interlaced = false + var frameRate = 0.0 + var name: String? +} +``` + +`Resolution` 结构定义和 `VideoMode` 类定义仅描述 `Resolution` 或 `VideoMode` 的外观,创建结构或类的实例: + +```swift +let resolution = Resolution(width: 1920) +let someVideoMode = VideoMode() +``` + +枚举 +---- + +### 定义枚举 + +```swift +enum Day { + case monday + case tuesday + case wednesday + case thursday + case friday + case saturday + case sunday +} + +let casualWorkday: Day = .friday +``` + +### Switch 语句 + +```swift +enum Dessert { + case cake(flavor: String) + case vanillaIceCream(scoops: Int) + case brownie +} + +let customerOrder: Dessert = .cake(flavor: "红色天鹅绒") +switch customerOrder { + case let .cake(flavor): + print("你点了一个 \(flavor) 蛋糕") + case .brownie: + print("你点了一块巧克力蛋糕") +} +// 打印: "你点了一个红色天鹅绒蛋糕" +``` + +### CaseIterable + +```swift +enum Season: CaseIterable { + case winter + case spring + case summer + case fall +} + +for season in Season.allCases { + print(season) +} +``` + +添加对 `CaseIterable` 协议的一致性以访问 `allCases` 属性,该属性返回枚举的所有案例的数组 + +### 原始值 + +```swift +enum Beatle: String { + case john, paul, george, ringo +} + +print("披头士是 \(Beatle.john.rawValue).") +// 打印: 披头士是 john. +``` + +### 相关值 + +```swift +enum Dessert { + case cake(flavor: String) + case vanillaIceCream(scoops: Int) + case brownie +} + +let order: Dessert = .cake(flavor: "红色天鹅绒") +``` + +### 实例方法 + + +```swift +enum Traffic { + case light + case heavy + + mutating func reportAccident() { + self = .heavy + } +} + +var currentTraffic: Traffic = .light + +currentTraffic.reportAccident() +// currentTraffic 现在是 .heavy +``` + +就像类和结构一样,枚举也可以有实例方法。如果实例方法改变了枚举的值,则需要将其标记为 `mutating` + +### 从原始值初始化 + +```swift +enum Hello: String { + case english = "Hello" + case japanese = "你好呀!" + case emoji = "👋" +} +let hello1 = Hello(rawValue: "你好呀!") +let hello2 = Hello(rawValue: "Привет") +print(hello1) // Optional(Hello.japanese) +print(hello2) // nil +``` + +### 计算属性 + +```swift +enum ShirtSize: String { + case small = "S" + case medium = "M" + case large = "L" + case extraLarge = "XL" + var description: String { + return "这件衬衫尺码是 \(self.rawValue)" + } +} +``` + +另见 +---- + +- [Swift 文档(官方)](https://www.swift.org/documentation/) +- [快速编程语言(官方)](https://docs.swift.org/swift-book/) +- [Learn Swift](https://www.codecademy.com/resources/cheatsheets/language/swift) +- [Swift 开发人员的一站式快速参考](https://swiftly.dev/) \ No newline at end of file diff --git a/scripts/assets/swift.svg b/scripts/assets/swift.svg new file mode 100644 index 00000000..bd2eae5a --- /dev/null +++ b/scripts/assets/swift.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file