iOS-swift4学习(基础类型)

一:字符串知识点

  1. 字符穿插输出
let friendlyWelcome = "Hello!"
print("The current value of friendlyWelcome is \(friendlyWelcome)")
  1. 类型别名 赋值一个新的类型名
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
  1. 函数错误处理 - throws
func canTrowAnError() throws {
    // 这个函数有可能抛出错误
}

do {
    try canTrowAnError()
     // 没有错误消息抛出
} catch {
    // 有一个错误消息抛出
}
  1. 断言进行调试 & 强制执行先决条件
    • assert 开发阶段
    • precondition 生产环境
let age = 1
assert(age > 0, "age 大于0了")

let index = 1
precondition(index > 0, "index 小于0了")
  1. 三目运算 & 空合运算符(a ?? b)
var a: String?
let b: String? = "123"
a != nil ? a! : b
let c = a ?? b
  1. 区间运算符
 闭区间运算符(a...b)定义一个包含从 a 到 b(包括 a 和 b)的所有值的区间
 半开区间运算符(a..<b)定义一个从 a 到 b 但不包括 b 的区间
 单侧区间 (a...) || (...a) || (a<..)||(..<a) 可以表达往一侧无限延伸的区间
  1. 多行字符串字面量
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(回车符)
 \"(双引号)
 \'(单引号)
  1. 字符串 isEmpty属性来判断该字符串是否为空
let textValue = "String"
if textValue.isEmpty {
    print("Nothing to see here")
}
  1. 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)) // 删除一段字符串
  1. 字符前缀&后缀 判断
let hasString = "The White Rabbit put on his spectacles"

if hasString.hasPrefix("The") {
    print("如果前缀是 The")
}
if hasString.hasSuffix("spectacles") {
    print("如果后缀是 spectacles")
}

二:集合类型小结

  1. 创建一个带有默认值的数组
var threeDoubles: [Int] = Array(repeating: 0, count: 6)
/*等价于 [0, 0, 0, 0, 0, 0]*/
  1. 数组添加一个值
threeDoubles.append(2)
/* 000000 -> 0000002*/
  1. 利用下标来一次改变一系列数据值
threeDoubles[2...5] = [2,4] 
/* 00000002 -> 002502 */
  1. 数组的遍历 - enumerated()
for (index, value) in threeDoubles.enumerated() {
    
     print("Item \(String(index + 1)): \(value)")
}
  1. 集合set的顺序遍历
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"] // 集合必须显示声明

for value in favoriteGenres.sorted() {
    print("\(value)")
}
  1. 集合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]
  1. 集合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
  1. 字典更新值且返回旧值 - updateValue
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
let DUBValue = airports.updateValue("Airport", forKey: "DUB")
 /*newDUB = 有旧值就输出旧值 Dublin  没有就输出 nil*/
  1. 获取字典所有值或键
let airportCodes = [String](airports.keys) /* ["YYZ", "LHR"] */
let airportNames = [String](airports.values) /* ["Toronto Pearson", "Airport"] */

三:小知识点

  1. 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)
}
  1. While 循环的二种方式
/* while循环,每次在循环开始时计算条件是否符合;*/
while condition {
    statements
}

/* repeat-while循环,每次在循环结束时计算条件是否符合。*/
repeat {
    statements
} while condition

  1. 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")
}
  1. 控制转移语句
  • continue语句告诉一个循环体立刻停止本次循环,重新开始下次循环。就好像在说“本次循环我已经执行完了”,但是并不会离开整个循环体。

  • break语句会立刻结束整个控制流的执行。break 可以在 switch 或循环语句中使用,用来提前结束switch或循环语句。

  • fallthroughswitch一个分支中,如果这个分支成立就会继续往贯穿到下一个简单地使代码继续连接到下一个分支

  • return 直接结束当前函数

  • throwreturn相似 如果表达式错误会离开退出当前函数

enum VendingMachineError: Error {
    case invalidSelection                     //选择无效
    case insufficientFunds(coinsNeeded: Int) //金额不足
    case outOfStock                             //缺货
}
throw VendingMachineError.insufficientFunds(coinsNeeded: 5)//代码抛出一个错误,提示贩卖机还需要5个硬币:
  1. guard
  • 像if语句一样,guard的执行取决于一个表达式的布尔值。我们可以使用guard语句来要求条件必须为真时,以执行guard语句后的代码。不同于if语句,一个guard语句总是有一个else从句,如果条件不为真则执行else从句中的代码。
func greet(person: [String: String]) {
    guard let name = person["name"] else {
        return
    }
    print(name)
}
  1. 检测 API 可用性
if #available(iOS 10, macOS 10.12, *) {
    // 在 iOS 使用 iOS 10 的 API, 在 macOS 使用 macOS 10.12 的 API
} else {
    // 使用先前版本的 iOS 和 macOS 的 API
}
  1. 过滤某些对象 - compactMap
let stringAry = ["0","1","2"]
let str = stringAry.compactMap { (item) -> Bool? in
    // 条件过滤
    return  Int(item)! > 1 
}
print("stringAry = \(stringAry)")

swift学习电梯:
swift-基础类型
swift-函数
swift-类和结构体

swift
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,326评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,228评论 1 304
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,979评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,489评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,894评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,900评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,075评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,803评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,565评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,778评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,255评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,582评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,254评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,151评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,952评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,035评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,839评论 2 277