一:字符串知识点
- 字符穿插输出
let friendlyWelcome = "Hello!"
print("The current value of friendlyWelcome is \(friendlyWelcome)")
- 类型别名 赋值一个新的类型名
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
- 函数错误处理 - throws
func canTrowAnError() throws {
// 这个函数有可能抛出错误
}
do {
try canTrowAnError()
// 没有错误消息抛出
} catch {
// 有一个错误消息抛出
}
- 断言进行调试 & 强制执行先决条件
- assert 开发阶段
- precondition 生产环境
let age = 1
assert(age > 0, "age 大于0了")
let index = 1
precondition(index > 0, "index 小于0了")
- 三目运算 & 空合运算符(a ?? b)
var a: String?
let b: String? = "123"
a != nil ? a! : b
let c = a ?? b
- 区间运算符
闭区间运算符(a...b)定义一个包含从 a 到 b(包括 a 和 b)的所有值的区间
半开区间运算符(a..<b)定义一个从 a 到 b 但不包括 b 的区间
单侧区间 (a...) || (...a) || (a<..)||(..<a) 可以表达往一侧无限延伸的区间
- 多行字符串字面量
let quotation = """
The White Rabbit put on his spectacles. "Where shall I begin,
please your Majesty?" he asked.
"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""
print(quotation)
字符串字面量的特殊字符
转义字符\0(空字符)
\\(反斜线)
\t(水平制表符)
\n(换行符)
\r(回车符)
\"(双引号)
\'(单引号)
- 字符串 isEmpty属性来判断该字符串是否为空
let textValue = "String"
if textValue.isEmpty {
print("Nothing to see here")
}
- String Array、Dictionary 和 Set 的基本操作。
var greeting = "Guten Tag!"
print(greeting.startIndex)//G 第一个
print(greeting.endIndex)//! 最后一个
print(greeting.index(after: greeting.startIndex))//u -after 后面一个索引
print(greeting.index(before: greeting.endIndex))//! -before 前面一个索引
print(greeting.index(greeting.startIndex, offsetBy: 7))//a -greeting 对应偏移量的索引
print(greeting.insert("w", at: greeting.startIndex)) // 插入一个字符
print(greeting.insert(contentsOf: "ni hao", at: greeting.startIndex)) // 插入一段字符串
print(greeting.remove(at: greeting.endIndex)) // 删除一个字符
let range = greeting.index(greeting.endIndex, offsetBy: -6)..<greeting.endIndex
print(greeting.removeSubrange(range)) // 删除一段字符串
- 字符前缀&后缀 判断
let hasString = "The White Rabbit put on his spectacles"
if hasString.hasPrefix("The") {
print("如果前缀是 The")
}
if hasString.hasSuffix("spectacles") {
print("如果后缀是 spectacles")
}
二:集合类型小结
- 创建一个带有默认值的数组
var threeDoubles: [Int] = Array(repeating: 0, count: 6)
/*等价于 [0, 0, 0, 0, 0, 0]*/
- 数组添加一个值
threeDoubles.append(2)
/* 000000 -> 0000002*/
- 利用下标来一次改变一系列数据值
threeDoubles[2...5] = [2,4]
/* 00000002 -> 002502 */
- 数组的遍历 - enumerated()
for (index, value) in threeDoubles.enumerated() {
print("Item \(String(index + 1)): \(value)")
}
- 集合set的顺序遍历
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"] // 集合必须显示声明
for value in favoriteGenres.sorted() {
print("\(value)")
}
- 集合set的基本操作
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
- 使用 union(_:) 方法根据两个集合的值创建一个新的集合。
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- 使用 intersection(_:) 方法根据两个集合中都包含的值创建的一个新的集合
oddDigits.intersection(evenDigits).sorted()
// []
- 使用 subtracting(_:) 方法根据不在该集合中的值创建一个新的集合。
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
- 使用 symmetricDifference(_:) 方法根据在一个集合中但不在两个集合中的值创建一个新的集合。
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
- 集合set成员关系和相等
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
- 使用“是否相等”运算符(==)来判断两个集合是否包含全部相同的值。
houseAnimals == favoriteGenres // false
- 使用isSubset(of:)方法来判断一个集合中的值是否也被包含在另外一个集合中。
houseAnimals.isSubset(of: farmAnimals)// true
- 使用isSuperset(of:)方法来判断一个集合中包含另一个集合中所有的值。
farmAnimals.isSuperset(of: houseAnimals)// true
- 使用isStrictSubset(of:)或者isStrictSuperset(of:)方法来判断一个集合是否是另外一个集合的子集合或者父集合并且两个集合并不相等。
houseAnimals.isStrictSubset(of: farmAnimals)// true
farmAnimals.isStrictSuperset(of: houseAnimals)// true
- 使用isDisjoint(with:)方法来判断两个集合是否不含有相同的值(是否没有交集)。
farmAnimals.isDisjoint(with: cityAnimals)// true
- 字典更新值且返回旧值 - updateValue
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
let DUBValue = airports.updateValue("Airport", forKey: "DUB")
/*newDUB = 有旧值就输出旧值 Dublin 没有就输出 nil*/
- 获取字典所有值或键
let airportCodes = [String](airports.keys) /* ["YYZ", "LHR"] */
let airportNames = [String](airports.values) /* ["Toronto Pearson", "Airport"] */
三:小知识点
- stride() 函数 循环跳过不需要的标记。
let minutes = 60 // 源
let minuteInterval = 5 // 间隔
let fromValue = 0 // 起点值
for _ in stride(from: fromValue, to: minutes, by: minuteInterval){
// 0..<60 每5分钟渲染一个刻度线 (0, 5, 10, 15 ... 45, 50, 55)
}
for _ in stride(from: fromValue, through: minutes, by: minuteInterval) {
// 0...60 每5分钟渲染一个刻度线 (0, 5, 10, 15 ... 45, 50, 55,60)
}
- While 循环的二种方式
/* while循环,每次在循环开始时计算条件是否符合;*/
while condition {
statements
}
/* repeat-while循环,每次在循环结束时计算条件是否符合。*/
repeat {
statements
} while condition
- switch
let somePoint = (1, 1)
switch somePoint {
case (0, 0):
print("\(somePoint) is at the origin")
case (_, 0):
print("\(somePoint) is on the x-axis")
case (-2...2, -2...2):
print("\(somePoint) is inside the box")
default:
print("\(somePoint) is outside of the box")
}
- 控制转移语句
continue
语句告诉一个循环体立刻停止本次循环,重新开始下次循环。就好像在说“本次循环我已经执行完了”,但是并不会离开整个循环体。break
语句会立刻结束整个控制流的执行。break
可以在switch
或循环语句中使用,用来提前结束switch
或循环语句。fallthrough
在switch
一个分支中,如果这个分支成立就会继续往贯穿到下一个简单地使代码继续连接到下一个分支return
直接结束当前函数throw
和return
相似 如果表达式错误会离开退出当前函数
enum VendingMachineError: Error {
case invalidSelection //选择无效
case insufficientFunds(coinsNeeded: Int) //金额不足
case outOfStock //缺货
}
throw VendingMachineError.insufficientFunds(coinsNeeded: 5)//代码抛出一个错误,提示贩卖机还需要5个硬币:
- guard
- 像if语句一样,guard的执行取决于一个表达式的布尔值。我们可以使用guard语句来要求条件必须为真时,以执行guard语句后的代码。不同于if语句,一个guard语句总是有一个else从句,如果条件不为真则执行else从句中的代码。
func greet(person: [String: String]) {
guard let name = person["name"] else {
return
}
print(name)
}
- 检测 API 可用性
if #available(iOS 10, macOS 10.12, *) {
// 在 iOS 使用 iOS 10 的 API, 在 macOS 使用 macOS 10.12 的 API
} else {
// 使用先前版本的 iOS 和 macOS 的 API
}
- 过滤某些对象 - compactMap
let stringAry = ["0","1","2"]
let str = stringAry.compactMap { (item) -> Bool? in
// 条件过滤
return Int(item)! > 1
}
print("stringAry = \(stringAry)")
swift学习电梯:
swift-基础类型
swift-函数
swift-类和结构体