assert(条件,断言信息)
断言被触发时则应用终止
空合运算符(a??b)对可选变量a进行空判断,如果a包含一个值就进行解封,否则返回一个默认值b。
表达式a必须是一个可选变量
b的类型要和a存储值的类型保持一致
相当于a!=nil?a!:b
区间运算符
for index in 1...5{
print("\(index) * 5 = \(index * 5)")
}
字符串变量可通过isEmpty属性来判断该字符串是否为空
常量字符串不可以被修改
String类型是值类型,任何情况下,进行操作时都会对已有字符串值创建新副本
可遍历字符串中的charaters属性来获取每一个字符的值
let catCharacters:[Character] = ["C","a","t","!","?"]
let catString = String(catCharacters)
print(catString)
字符串插值即可以是一个整形的变量a作为\(a)被插入到一个字符串常量中。
Unicode是一个国际标准,用于文本的编码和表示。
字符串字面量的特殊字符: \"双引号
可若站的字符群集作为Character值来连接或者改变字符串是,并不一定会更改字符串的字符数量
可扩展的字符群集可以组成一个或者多个Unicode标量,这意味着不同的字符以及相同字符的不同表示方式可能学要不同数量的内存空间来存储,所以Swift中的字符在一个字符串中并不一定占用相同的内存空间数
每一个String的值都有一个关联的索引类型,String.index,它对应着字符串中的每一个Character的位置
endIndex对应的是获取String最后一个Character的后一个位置的索引
let greeting = "Guten Tag!"
greeting[greeting.startIndex]//G
greeting[greeting.index(before:greeting.endIndex)] //!//index(before:)
greeting[greeting.index(after:greeting.startIndex)] //u//index(after)
let index = greeting.index(greeting.startIndex,offsetBy:7)//index(_:offsetBy)
greeting[index] //a
使用characters属性的indices属性会创建一个包含全部索引的范围
for index in greeting.characters.indices{
print("\(greeting[index])",terminator:"")
}
插入和删除
insert(contentsOf: ,at: )
remove(at: )
let range = welcome.index(welcome.endIndex,offsetBy:-6)..<weicome.endIndex
welcome.removeSubrange(range)
可用hasPrefix()来计算包含前缀的字符串数
可用hasSuffix()来计算包含后缀的字符串数
创建一个带默认值的数组:var threeDouble = Array(repeating:0.0,coutnt:3)
可通过加法运算符来组合两种已存在的相同类型数组
创建一个空数组:var a = [Int]()
用数组字面量构造数组
var shop:[String] = ["Eggs","Milk"]
可用布尔属性isEmpty检查count属性是否为0
还可以利用下标一次改变一系列数据值:a[4...6] = [1,2]
可用insert(content, at: num)插在具体表项之前
remove(at:)移除数组中的某一项并返回这个被移除的数据项,移除最后一项用removeLast()
集合用来存储相同类型并且没有确定顺序的值,并且确保每个元素值出现一次
创建一个空集合:var letters = Set<Character>()
数组字面量创建集合
var favoriteGenres:Set<String> = ["Rock","Classical","Hip hop"]
Set类型不能从数组字面量中被单独推断出来,因此Set类型必须显式声明
可直接用insert和remove插入和删除元素
可用contains方法检查Set中是否包含一个特定的值
有多种创建不同集合的方法,可参看swift3.0第94页
字典简直类型一致时可以不必写出字典的类型
字典添加新值可以使用一个恰当类型的键作为下标索引,并且分配恰当类型的新值
也可以使用下标语法来改变特定键对应的值
可使用updateValue(_:forKey:)更新或者新添值,该函数还会返回一个可选值,用于检查更新是否成功
if let oldValue = airports.updateValue("Dublin Airport",forKey:"DUB"){
print("the old value for DuB was (oldValue)")
}
removeValue(forKey:)方法可用来在字典中移除键值对,并且返回被移除的值,在没有值的情况下返回nil
键值对对应着keys和values
为了以特定的顺序遍历字典的键或值,可以对字典的keys或values属性进行sorted()方法
swift中的switch与C之类的区别在于,当匹配的case分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个case分支,如果想继续执行的话可以在末尾添加一个fallthrough
不像C语言里的switch语句,swift里面为了让单个case同时匹配不同的元素时,需要将这两个值组合成一个复合匹配,并且用逗号分开
swift允许多个case匹配同一个值,如果存在多个匹配。那么只会执行第一个被匹配的case分支。
case 分支可以使用where语句来判断额外的条件
let a=(1,-1)
switch b{
case let (x,y) where x==y
print("(\(x),\(y)) is on the line x==y")
case let (x,y)where x==-y
print("(\(x),\(y)) is on the line x==-y")
}
要想改变参数的值,需要在函数参数的类型前面加上inout,即使用
输入输出参数,调用函数时需要传入的是变量而不能是常量,函数参数中写的参数前面应加上&
闭包是自包含的函数代码块,可以捕获的存储其所在上下文中任意常量和变量的引用
全局函数是一个有名字但不会捕获任何值的闭包
嵌套函数是一个有名字病可以捕获其封闭函数域内值的闭包
闭包表达式是可以捕获其上下文中变量或常量名的匿名闭包
闭包中可变参数应放在参数列表的最后一位
嵌套函数中捕获的外部参数并修改之后在调用完外围函数之后仍然会一直保留
swift3.0第136页如果你创建了另一个函数,则会有属于其自己的心得变量
当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回时才被执行
我们称该闭包从函数中逃逸
当使用字符串作为枚举类型的原始知识,每个枚举成员的隐式原始值为该枚举成员的名称
结构体和枚举是值类型,值类型被赋予一个变量,常量活着被传递给一个函数的时候,其值会被拷贝
当把一个结构体的实例赋给另一个时,只是单纯的值拷贝,改变另一个的结构体成员时不会对原实例的
成员产生影响。
类时引用类型,引用的是已存在的实例本身而不是其拷贝
判断两个常量或者变量是否引用同一个类实例 ===
存储属性:
如果创建了一个结构体的实例并将其复制给一个常量,则无法修改
当值类型的实例被声明为常量时,它的所有属性也是常量
而属于饮用类型的类则不一样,把一个引用类型的实例赋给一个常量后,
仍然可以修改该实例的变量属性
延迟存储属性必须声明为变量,因为属性的初始值可能在实例构造完成之后才会得到
而常量属性在构造完成之前必须要有初始值
计算属性不直接存储值,而是用getter和setter来间接获取和设置其他属性或变量的值
调用类型方法用类名加点
类型属性是通过类型本身来访问的,而不是用实例
如果你使用闭包来初始化属性,请记住在闭包执行时,实例的其它部分都还没有初始化。这意味着你不能在闭包里访问其它属性,即使这些属性有默认值。同样,你也不能使用隐式的self属性,或者调用任何实例方法。