Swift基础知识
1 整数类型Int,长度与当前平台的原生字长相同:
在32位平台上,Int和Int32长度相同;
在64位平台上,Int和Int64长度相同。
2 对于浮点数(float,double)的数据,可以将数据用下划线分割,使其看起来一目了然。
let a = 100_0000_0000 // 10000000000 let b = 1_00.00_001_0002_1 //100.0000100021
3 元组Tuple
let error:(code: Int, message: String) = (404, "Not Found") error.code // 404 error.message // Not Found let point = (x: 10, y: 20) point.x // 10 point.y //20
4 print
let a = 1, b = 2, c = 3 print(a, b, c) print(a, b, c, separator: "--") print(“Hello") // 默认情况下 separator是空格,terminator是换行 print(a, b, c, separator: "--", terminator: ":)") print("Hello") // 打印结果 1 2 3 1--2--3 Hello 1--2--3:)Hello
5 switch:
(1)可以对任何数据类型做判断
(2)如果其中有某个语句什么都不做的话,可以使用“break”或者“()”。
let score = 80 switch (score) {
//可以使用区间 case 0 ..< 60 : print("failed") case 60 ..< 80 : print("Just so so") case 80 ..< 90 : print("good") case 90 ..< 100 : print("great"); case 100: print("perfect"); default: // 这个分支中什么都不做,可以使用“()”或者“break” () }
(3)fallthrough:执行完一条语句后,会直接跳入下一个case语句继续执行,不论条件是否满足都会执行。
let point = (0, 0) switch(point) { case (0, 0): print("It is origin") fallthrough case (_, 0): print("It is on the x-axis") fallthrough case (0, _): print("It is on the y-axis") fallthrough default: print("It is just an ordinary point.") }
// 打印结果:
It is origin
It is on the x-axis
It is on the y-axis
It is just an ordinary point.
加了fallthrough语句后,紧跟的后一个case条件不能定义常量和变量。
switch(point) { case (0, 0): print("It is origin") fallthrough case (x, 0): // 会报错,fallthrough后的下一个case语句不可以定义常量或变量 print("It is on the x-axis") }
执行完fallthrough语句后,直接跳到下一个case中去执行。fallthroungh后的语句不会执行。
let p = "girl" switch p { case "girl": print("小女孩"); fallthrough print("这是一个小女孩") // fallthrough后的这条语句不会执行,直接跳到下一个case中,不论下一个case的条件是否满足,都会执行下一个case中的语句 case "boy": print("小男孩") default: () } // 打印结果 小女孩 小男孩
6 where配合case的使用
let age = 19 switch age { case 10 ... 19: print("You are a teenage") default: print("You are not a teenage") } // 以上的switch可以写为下面的if条件判断 if case 10 ... 19 = age { // 注意只能写为 10 ... 19 = age, 不可以写为 age = 10 ... 19 print("You are a teenage") } else { print("You are not a teenage") } // if条件判断后,可以继续限制条件,通过“,”添加条件即可 if case 10 ... 19 = age, age >= 18 { print("You are a teenage and in a collage") } // 打印结果 You are a teenage You are a teenage You are a teenage and in a collage
for i in 1 ... 100 { if (i % 3 == 0) { print(i); } } // 以上代码可以改写为以下的代码 for case let i in 1 ... 100 where i % 3 == 0 { print(i); }
7 String、 Character
let a: Character = "a" // a let b: Character = "张" // 张 let c: Character = "\u{1F60F}" // 😏 let d: Character = "😎" // 😎 var m = "abcdef" m.characters.count // 6 var n = "数据结构和算法" n.characters.count // 7 let str1 = "😎😎😎😎😎" let str2: NSString = "😎😎😎😎😎" str1.characters.count // 5 str2.length // 10
let a: Character = "a" // a let b: Character = "张" // 张 let c: Character = "\u{1F60F}" // 😏
let d: Character = "😎" // 😎
var m = "abcdef"
m.characters.count // 6
var n = "数据结构和算法"
n.characters.count // 7
let str1 = "😎😎😎😎😎"
let str2: NSString = "😎😎😎😎😎"
str1.characters.count // 5
str2.length // 10
8 集合操作
var skillsA: Set = ["Objective-C", "Swift"] var skillsB: Set = ["HTML", "CSS", "JavaScript"] var skillsC: Set = ["Swift", "HTML"] // union 并集 let skillsD = skillsA.union(skillsB) // {"Objective-C", "Swift", "HTML", "CSS", "JavaScript"} // intersection 交集 let skillsE = skillsA.intersection(skillsC) // {"Swift"} // subtracting 差集 let skillsF = skillsA.subtracting(skillsC) // {"Objective-C"} // isSubset: 判断一个集合中的值是否也在另一个集合 // isStrictSubset: 判断一个集合是否是另一个集合的子集合,并且两个集合不相等 skillsF.isSubset(of: skillsA) // true skillsF.isSubset(of: skillsF) // true skillsF.isStrictSubset(of: skillsA) // true skillsF.isStrictSubset(of: skillsF) // false // isSuperset isStrictSuperset 同上面的isSubset isStrictSubset skillsA.isSuperset(of: skillsF) // true skillsA.isSuperset(of: skillsA) // true skillsA.isStrictSuperset(of: skillsF) // true skillsA.isStrictSuperset(of: skillsA) // false // isDisjoint 判断两个集合是否完全没有交集 skillsA.isDisjoint(with: skillsB) // true skillsA.isDisjoint(with: skillsC) // false
9 选择合适的数据结构
(1)数组:有序(查找的时间复杂度O(n))
(2)集合:无序、唯一性、集合操作、快速查找(查找的时间复杂度O(log n))
(3)字典:键-值数据对(查找的时间复杂度O(1))
10 ==判断两个值类型的数据是否相等;===判断两个引用类型的数据是否相等,即判断两个对象是否指向的是同一块内存。
class Person { var name: String var age: Int init (name: String, age: Int) { self.name = name self.age = age } } let p1 = Person(name: "Tom", age: 20) let p2 = p1
//p1 == p2 // 不可以这样写 p1 === p2 // true