[关闭]
@LarryTwofly 2023-03-30T10:39:38.000000Z 字数 7498 阅读 79

Swift 语言学习

iOS


一、简单介绍

1、版本记录
2014年8月:1.0版本、1.1版本、1.2版本
2015年9月:2.0版本、2.1版本
2016年3月:2.2版本、2.3版本

2016年9月:3.0版本、3.1版本

2017年9月:4.0版本
目前:4.2版本

2、swift优势
(1)性能:
![image_1cmno9ap31r9o15jk1pc8g221ps1u.png-71.5kB][1]
(2)开源

3、链接:
https://swift.org/about/
https://developer.apple.com/swift/

二、基础类型部分

1、数据类型修饰符

let 来声明常量,var来声明变量

  1. let maximumNumberOfLoginAttempts = 4
  2. var currentLoginAttempt = 0

可以一行声明多个

  1. var x = 0.0, y = 0.0, z = 0.0

2、类型标注

变量welcomeMessage为String类型

  1. var welcomeMessage: String

3、常量和变量的命名

  1. let π = 3.14159
  2. let 你好 = "你好世界"
  3. let 🐮 = "dogcow"
  4. let 🐶 = "dogcow"

原则:字母数字下划线,数字不能开头;大部分Unicode编码
禁止:数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。

4、输出常量和变量

  1. let π = 3.14159
  2. let 你好 = "你好,亲爱的"
  3. let 🐂 = "大牛"
  4. let 🐶 = "狗狗"
  5. print(π) //3.14159
  6. print(你好) //你好,亲爱的
  7. print("say:\(你好)") //say:你好,亲爱的
  8. print("say:"+你好) //say:你好,亲爱的
  9. print("say:",你好) //say:%@ 你好,亲爱的
  10. print(🐂+"say:"+你好+🐶) //大牛say:你好,亲爱的狗狗

5、注释

  1. 1// 这是一个注释
  2. 2/* 这是一个, 多行注释 */
  3. 3
  4. /* 这是第一个多行注释的开头
  5. /* 这是第二个被嵌套的多行注释 */
  6. 这是第一个多行注释的结尾 */

6、分号

看上面,仔细看看

7、整数

Swift 提供了8,16,32和64位的有符号和无符号整数类型(Int8、Int16、Int32和Int64)
(1)Int类型
在32位平台上,Int 和 Int32 长度相同。
在64位平台上,Int 和 Int64 长度相同。
(2)UInt类型
在32位平台上,UInt 和 UInt32 长度相同。
在64位平台上,UInt 和 UInt64 长度相同。
(3)其他:整数范围、整数符号

8、浮点数

分两种
(1)、Double表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
(2)、Float表示32位浮点数。精度要求不高的话可以使用此类型。

9、类型安全和类型推断

(1)、类型推断

  1. // meaningOfLife 会被推测为 Int 类型
  2. let meaningOfLife = 42
  3. // pi 会被推测为 Double 类型
  4. let pi = 3.14159
  5. // anotherPi 会被推测为 Double 类型
  6. let anotherPi = 3 + 0.14159

(2)、类型安全

  1. var meaningOfLife = 42
  2. // meaningOfLife 会被推测为 Int 类型
  3. meaningOfLife = "我是字符串" //报错啦

说明: Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。

9、数值型字面量

规则:

  • 一个十进制数,没有前缀。
  • 一个二进制数,前缀是0b。
  • 一个八进制数,前缀是0o。
  • 一个十六进制数,前缀是0x。

(1)十进制为17的不同进制

  1. let decimalInteger = 17
  2. let binaryInteger = 0b10001 // 二进制的17
  3. let octalInteger = 0o21 // 八进制的17
  4. let hexadecimalInteger = 0x11 // 十六进制的17

(2)指数表示:exp

  • 十进制:1.25e2 表示 1.25 × 10^2,等于 125.0。
  • 十六进制:0xFp2 表示 15 × 2^2,等于 60.0。

(3)可读性

  1. let paddedDouble = 000123.456
  2. let oneMillion = 1_000_000
  3. let justOverOneMillion = 1_000_000.000_000_1

10、类型转换

  1. let three = 3
  2. let pointOneFourOneFiveNine = 0.14159
  3. let pi = Double(three) + pointOneFourOneFiveNine
  4. // pi 等于 3.14159,所以被推测为 Double 类型

11、类型别名

  1. typealias AudioSample = UInt16

12、布尔值:Boolean

  1. let orangesAreOrange = true
  2. let turnipsAreDelicious = false

13、元组

  1. let http404Error = (404, "Not Found")
  2. // http404Error 的类型是 (Int, String),值是 (404, "Not Found")

14、可选值

  1. var surveyAnswer: String?
  2. // surveyAnswer 被自动设置为 nil

15、错误处理

函数

  1. //函数实现
  2. func canThrowAnError() throws {
  3. // 这个函数有可能抛出错误
  4. }
  5. //调用函数
  6. do {
  7. try canThrowAnError()
  8. // 没有错误消息抛出
  9. } catch {
  10. // 有一个错误消息抛出
  11. }

16、断言和先决条件

  1. let age = -3
  2. assert(age >= 0, "A person's age cannot be less than zero")// 因为 age < 0,所以断言会触发
  3. assert(age >= 0)//等价于:没有断言信息

17、字符串

(1)count、索引index、插入insert、删除remove、子字符串prefix

三、运算符

说明:运算符分为一元、二元和三元运算符

  • 一元运算符对单一操作对象操作(如 -a)。一元运算符分前置运算符和后置运算符,前置运算符需紧跟在操作对象之前(如 !b),后置运算符需紧跟在操作对象之后(如 c!)。
  • 二元运算符操作两个操作对象(如 2 + 3),是中置的,因为它们出现在两个操作对象之间。
  • 三元运算符操作三个操作对象,和 C 语言一样,Swift 只有一个三元运算符,就是三目运算符(a ? b : c)。

运算符分类

  • 赋值运算符
  • 算术运算符
  • 求余运算符
  • 一元负号运算符
  • 一元正号运算符
  • 组合赋值运算符
  • 比较运算符(Comparison Operators)
  • 三目运算符(Ternary Conditional Operator)
  • 空合运算符(Nil Coalescing Operator)
  1. let defaultColorName = "red"
  2. var userDefinedColorName: String? //默认值为 nil
  3. // userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"
  4. var colorNameToUse = userDefinedColorName ?? defaultColorName
  • 区间运算符(Range Operators)

(1)闭区间运算符

  1. for index in 1...5 {
  2. print("\(index) * 5 = \(index * 5)")
  3. }
  4. // 1 * 5 = 5
  5. // 2 * 5 = 10
  6. // 3 * 5 = 15
  7. // 4 * 5 = 20
  8. // 5 * 5 = 25

(2)半开区间运算符

  1. let names = ["Anna", "Alex", "Brian", "Jack"]
  2. for i in 0..<names.count-1 {
  3. print("第 \(i + 1) 个人叫 \(names[i])")
  4. }
  5. /*输出:
  6. 第 1 个人叫 Anna
  7. 第 2 个人叫 Alex
  8. 第 3 个人叫 Brian
  9. */

(3)单侧区间运算符

  1. let names = ["Anna", "Alex", "Brian", "Jack"]
  2. for i in 0..<names[2..] {
  3. print(name)
  4. }
  5. /*输出
  6. Brian
  7. Jack
  8. */
  9. for i in 0..<names[...2] {
  10. print(name)
  11. }
  12. /*输出
  13. Anna
  14. Alex
  15. Brian
  16. */
  17. //单侧半开区间
  18. for name in names[..<2] {
  19. print(name)
  20. }
  21. /*输出
  22. Anna
  23. Alex
  24. */
  • 逻辑运算符(Logical Operators)

(1)逻辑非(!a)
(2)逻辑与(a && b)
(3)逻辑或(a || b)

四、数组和集合

1、创建数组

  1. var someInts = [Int]()
  2. //添加元素
  3. someInts.append(3)
  4. //插入元素
  5. a.insert(9, at: 0)

2、通过两个数组相加创建一个数组

  1. // anotherThreeDoubles 被推断为 [Double],等价于 [2.5, 2.5, 2.5]
  2. var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
  3. // sixDoubles 被推断为 [Double],等价于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
  4. var sixDoubles = threeDoubles + anotherThreeDoubles

3、数组判空

  1. if shoppingList.isEmpty {
  2. print("The shopping list is empty.")
  3. } else {
  4. print("The shopping list is not empty.")
  5. }

4、数组遍历

(1)

  1. for item in shoppingList {
  2. print(item)
  3. }

(2)

  1. for (index, value) in shoppingList. enumerated() {
  2. print("Item \(String(index + 1)): \(value)")
  3. }

5、集合与数组类似

表示:Set

6、字典

表示:[key 1: value 1, key 2: value 2, key 3: value 3]

五、控制流

1、For-in

  1. //元素遍历
  2. let names = ["Anna", "Alex", "Brian", "Jack"]
  3. for name in names {
  4. print("Hello, \(name)!")
  5. }
  6. // Hello, Anna!
  7. // Hello, Alex!
  8. // Hello, Brian!
  9. // Hello, Jack!
  1. //根据键值对
  2. let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
  3. for (animalName, legCount) in numberOfLegs {
  4. print("\(animalName)s have \(legCount) legs")
  5. }
  1. //根据下标遍历
  2. for index in 1...5 {
  3. print("\(index) times 5 is \(index * 5)")
  4. }
  1. //省略元素。原来:for p in names 简化后:for _ in names
  2. let base = 3
  3. let power = 10
  4. var answer = 1
  5. for _ in 1...power {
  6. answer *= base
  7. }
  1. //阶梯式遍历
  2. let minuteInterval = 5
  3. for tickMark in stride(from: 0, to: minutes, by: minuteInterval){
  4. // 每5分钟渲染一个刻度线 (0, 5, 10, 15 ... 45, 50, 55)
  5. }

2、which 循环

  1. which stement {
  2. case 1:
  3. ...
  4. case 2:
  5. ...
  6. default:
  7. ...
  8. }
  1. which stement {
  2. case 1,3,5,7,8:
  3. ...
  4. case 2:
  5. ...
  6. default:
  7. ...
  8. }
  1. which stement {
  2. case let index where index <= 100:
  3. ...
  4. case 101:
  5. ...
  6. default:
  7. ...
  8. }
  1. which stement {
  2. case 0...100:
  3. ...
  4. case 101..200:
  5. ...
  6. default:
  7. ...
  8. }
  1. let somePoint = (1, 1)
  2. switch somePoint {
  3. case (0, 0):
  4. print("\(somePoint) is at the origin")
  5. case (_, 0):
  6. print("\(somePoint) is on the x-axis")
  7. case (0, _):
  8. print("\(somePoint) is on the y-axis")
  9. case (-2...2, -2...2):
  10. print("\(somePoint) is inside the box")
  11. default:
  12. print("\(somePoint) is outside of the box")
  13. }
  1. let anotherPoint = (2, 0)
  2. switch anotherPoint {
  3. case (let x, 0):
  4. print("on the x-axis with an x value of \(x)")
  5. case (0, let y):
  6. print("on the y-axis with a y value of \(y)")
  7. case let (x, y):
  8. print("somewhere else at (\(x), \(y))")
  9. }

3、while语句

  1. while condition {
  2. statements
  3. }
  1. repeat {
  2. statements
  3. } while condition

4、where

5、控制转移语句

说明:控制转移语句改变你代码的执行顺序,通过它可以实现代码的跳转。Swift 有五种控制转移语句:

  • continue
  • break
  • fallthrough(贯穿)
  • return
  • throw
  1. which stement {
  2. case let index where index <= 100:
  3. ...
  4. fallthrough
  5. case 50...200:
  6. ...
  7. default:
  8. ...
  9. }

6、guard(提前退出)

  1. func greet(person: [String: String]) {
  2. guard let name = person["name"] else {
  3. return
  4. }
  5. print("Hello \(name)")
  6. }

7、带标签语句

表示:label name: while condition { statements }

  1. let finalSquare = 6
  2. var square = 0
  3. gameLoop: while square != finalSquare {
  4. square = arc4random() % 6 + 1
  5. ...
  6. }
  7. print("Game over!")

六、函数

(1)参数

  1. func sayHelloWorld() {
  2. print(str)
  3. }
  4. func sayHelloWorld(str: String) {
  5. print(str)
  6. }
  7. func sayHelloWorld2(str: String?) {
  8. print(str)
  9. }
  10. func sayHelloWorld3(str: String = "default str") {
  11. print(str)
  12. }
  13. func sayHelloWorld3(_ str: String = "default str") {
  14. print(str)
  15. }
  16. func sayHelloWorld3(str: String...) {
  17. print(str)
  18. }

(2)返回值

  1. func sayHelloWorld() -> String {
  2. return "hello world"
  3. }
  4. func sayHelloWorld() -> (String, String) {
  5. return ("xiaoming", "hello world")
  6. }

(3)函数 参数标签和参数名称

  1. func sayHelloWorld3(str: String = "default str") {
  2. print(str)
  3. }

六、闭包

1、闭包

  1. let s = ["ab","ccc","ad","dsa","banadsf"]
  2. let ss = s.sorted(by: backward)
  3. let sss = s.sorted { (s1, s2) -> Bool in
  4. return s1 > s2
  5. }
  6. let ssss = s.sorted(by: { $0 > $1 })
  7. let sssss = s.sorted(by: > )
  8. func backward(_ s1: String, _ s2: String) -> Bool {
  9. return s1 > s2
  10. }

2、相关方法

(1)map函数

  1. let values = [2, 4, 5, 7]
  2. //获取:
  3. //for循环实现
  4. var squares: [Double] = []
  5. for value in values {
  6. squares.append(value*value)
  7. }
  8. //map实现
  9. let squares = values.map { $0 * $0 }
  10. //map原型一
  11. let squares = values.map { value in value * value}
  12. //map原型二
  13. let squares = values.map( { (value: Double) -> Double in
  14. return value * value
  15. })
  16. //map原型三
  17. let squares = values.map(backward)
  18. func backward(_ s1: Int , _ s2: Int) -> Int {
  19. return s1 * s2
  20. }

(2)filter函数

  1. let digits = [1, 4, 10, 15]
  2. let even = digits.filter { $0 % 2 == 0 }
  3. 举例子:
  4. paperSlices.removeAll()
  5. var temps = papers.dropFirst(0)
  6. while let first = temps.first {
  7. let s = temps.prefix { first.createdAt.isSameDay($0.createdAt) }
  8. paperSlices.append(Array(s))
  9. temps = temps.dropFirst(s.count)
  10. }

(3)Reduce组合函数

  1. // 以下两行输出:28.0
  2. let items = [2.0, 4.0, 5.0, 7.0]
  3. let total = items.reduce(10, combine: +)
  4. // 以下两行输出:"abcdefghi"
  5. let codes = ["abc", "def", "ghi"]
  6. let text = codes.reduce("", combine: +)
  7. //Reduce函数原型:
  8. let name = ["alan", "brian", "charlie"]
  9. let scv = name.reduce("==") {
  10. text, name in "\(text), \(name)"
  11. }
  12. // "==, alan, brian, charlie"

(4)FlatMap函数

  1. // 以下两行输出:[5, 2, 7, 4, 8, 9, 1, 3]
  2. let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
  3. let flat = collections.flatMap { $0 }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注