the-swift-programming-language 学习笔记
常量和变量
常量是定义是不可以修改的,在类中定义的常量,可以在构造函数中赋值。let修饰
变量是可以修改的。var修饰
字符串中字符的遍历
for code in string {}
for codeunit in string.unicodeScalars {}
控制语句
break 跳出循环体
continue 终止当前,进入下一个循环
label 配置break和continue使用;用label标记循环体,break label跳出标记的循环体,continue label 是进入下一个标记的循环
fallthrogh:switch语句中使用,用在case节点方法后面,作用是贯穿下一个case
switch语句中必须包含 default节点,case节点不需要使用break
范围使用
number1…number2 == number1<=var<=number2
number1..<number2 == number1<=var<number2
元组
var tuples = (int,string,obj,…)
字典
Dictionary<KyeT,ValueT>
for (key,value) in Dictionary {}
for key in Dictionary.keys
for value in Dictionary.values
在字典复制时,取决于字典的value是值类型还是引用类型
函数
func Function(params) -> params { 方法体 }
函数的参数默认是let 常量,需要变量需要在定义参数是,定义var
参数定义时,可以赋值默认值 func Test(paramens:String = "default value") {}
可变参数 func sum(numbers:Double…) 类似传递一个Array<T> 的参数
参数传递引用 inout 关键字
返回多值(返回一个元组类型的值)
函数本身可以作为参数传递,也可以作为范围值
参数的内部名称和外部名称
函数类型
嵌套函数
定义在其他函数体中的函数
闭包
类似lambdas表达式
全局函数是一个有名字,但不会捕获任何值得闭包
嵌套函数是一个有名字并且可以捕获其封闭函数域内值得闭包
闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量的没有名字的闭包
表达式:
{ (parameters) -> returntype in
statements
}
var numbers =[1,3,30,16,25,73,97]
func backwards(s1:String, s2:String) -> { return s1>s2 }
作为函数参数传递
sort(numbers,backwars)
闭包表达式传递
sort(numbers,{
(s1:String, s2:String) -> bool in
Return s1>s2
})
对于短的闭包可写作一行
Sort(numbers,{(s1:String, s2:String) -> bool in return s1>s2})
闭包能自动推断参数类型
sort(numbers,{s1, s2 in return s1>s2})
单行表达式可以省略return 关键字
sort(numbers,{s1,s2 in s1>s2})
参数名简写
sort(numbers,$0>$1)
运算符函数
sort(numbers,>)
尾随闭包:把闭包作为最后一个参数传递给函数,就可以使用尾随闭包
sort(numbers){
(s1:String, s2:String) -> bool in
Return s1>s2
})
Sort(numbers){$0>$1}
结构和类
在swift中只有类似引用类型,其他都是值类型
- 共同:
定义属性
定义方法
定义下标
定义构造器
扩展方法(external)
遵循协议(protocol)
- 不同:
类允许继承
类型转换允许在运行时检查和解释一个类型实例的类型
析构允许一个类实例释放任何其被分配的资源
引用计数允许对一个类的多次引用
属性
可以通过闭包和函数来设置属性默认值
存储属性
存储在特定类或结构的实例里的一个常量(let 定义)或变量(var 定义)
常量和存储属性
定义一个常量的结构体属性,该结构体的所有属性也就变成了常量,对已引用类型的class则不一样,把一个class的实例赋给一个常量后,仍然可以修改实例的变量属性
延迟存储属性
用@lazy 来表示一个延时存储属性,延时存储属性必须用 var声明;当属性的值依赖在实例的构造过程前无法知道具体值的外部因素,或者当属性的值需要复杂大量的计算是,可以只在需要的时候来计算
计算属性
计算属性不直接存储值,而是提供一个getter来获取值,一个setter来间接设置其他属性或者变量的值。在setter中默认使用newValue表示接收的值
只读计算属性
就是只有getter的计算属性
属性监听器
willSet 在设置新的值之前调用。默认使用newValue表示新值
didSet 在新的值被设置之后立即调用。默认使用oldValue表示旧值
全局变量和局部变量
计算属性和属性监听器所属的模式也可以用于全局变量和局部变量,全局变量是在函数、方法、闭包或任何类型之外定义的变量,局部变量是在函数、方法或闭包内部定义的变量
全局的常量或变量都是延迟计算的,跟延迟计算属性相似,不同的地方在于,全局的变量或者常量不需要标记@lazy特性;局部范围的常量或者变量不会延迟计算。
类型属性
类型属性用于定义特定类型所有实例共享的数据
对于值型类(枚举和结构)可以定义存储和计算型类型属性,对于class则只能定义计算型类型属性
在枚举和机构中用static 声明一个类型属性
在class中用class声明一个类型属性
方法
值类型的属性不能在他的实力方法中被修改,如果确定需要修改某个具体值类型的属性,可以选择变异方法(用 mutating 声明的方法),然后方法就可以从方法内部修改它的属性
类型方法
于类型属性相同
附属脚本 subscript
语法:
subscript(parameter:parametertype) -> returntype {
get{
}
set(newValue){
}
}
构造器
在类和结构中定义变量或常量属性必须必须在构造器中赋值,或者在定义时赋值
在构造器中可以修改常量属性
可选属性类型
用type? 声明,默认值是nil
自动引用计数(ARC)
Swift使用ARC来跟踪管理应用使用的内存。大部分情况下,意味着在swift中,内存管理仍然工作,不需要自己考虑内存管理的事情,当实例不再被使用是,ARC会自动释放类实例所占的内存
解决类实例见的强引用环
弱引用 (使用weak声明若引用)
无主引用 (使用unowned 声明无主引用)
无主引用以及隐式展开的可选属性 (隐式展开的可选属性 type!)
闭包产生的强环形引用:将一个闭包赋值给类实例的某个属性,并且这个闭包使用了实例。这个闭包可能访问实例的某个属性,例如self.someProperty,或者调用某个方法,例如:self.someMethod()。
解决闭包闭包产生的强环形引用,定义占有列表(用 [unowed/weak self] 声明)
@lazy var property : (parametertype) -> returntype = {
[unowned self] (parameter: parametertype) -> returntype in
}
当闭包和占有的实例总是相互引用并且同时销毁时,闭包占有定义为unowned。相反,当占有引用有时可能会说nil时,将闭包内的占有定义为weak。弱引用总是可选类型。
两个属性值都是可选类型都可能是nil时,使用弱引用
两个属性中只有一个是可选类型,并且可能nil时,使用无主引用
两个属性都必须有值就使用无主引用和隐式展开可选属性。
强制拆包
声明可选类型的强制拆包:var s = String? var t = s!
扩展
extension SomeType = {}
协议
protocol SomeProtocol {}
突变方法
能在方法或函数内部修改实例类型的方法称为突变方法。mutating
原文地址:https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/index.html
译文地址:http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/