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/
the-swift-programming-language 学习笔记的更多相关文章
- The C++ Programming Language 学习笔记 第7章 函数
1.关于内联函数(inline) 借用一下书中的例子. inline int fac(int n) { ) ? :n*fac(n-); } inline描述符给编译器一个提示,要求 ...
- The C++ Programming Language 学习笔记 第6章 表达式和语句
1.关于strcpy函数. 书中说c风格的字符串尽量少用,strcpy这样的函数应该也要少用.这里讲这个函数主要是要通过本章课后练习第十题来讲一下前面提及的要点.巩固一下前几章的知识.写了一段,本来感 ...
- The C++ Programming Language 学习笔记 第5章 指针、数组和结构
1.关于输出指向字符的指针的值. 现在定义,char c='a',char* pc=&c.在C中,输出该值只需要printf("%p\n",pc);而在C++中,如果cou ...
- The C++ Programming Language 学习笔记 第四章 类型和声明
1.关于main 函数中的 return 0 C99标准中,main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统).如果 main 函数的最后没有写 return ...
- 《The Swift Programming Language》的笔记-第24页
The Swift Programming Language读书笔记学习笔记 第24页 本页主要内容有两个:打印输出和怎样在swift凝视代码 1 怎样打印变量和常量的值? 使用println函数,细 ...
- The Swift Programming Language 英文原版官方文档下载
The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...
- The Swift Programming Language 中文翻译版(个人翻新随时跟新)
The Swift Programming Language --lkvt 本人在2014年6月3日(北京时间)凌晨起来通过网络观看2014年WWDC 苹果公司的发布会有iOS8以及OS X 10.1 ...
- [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01
注:CocoaChina翻译小组已着手此书及相关资料的翻译,楼主也加入了,多人协作后的完整译本将很快让大家看到. 翻译群:291864979,想加入的同学请进此群哦.(本系列不再更新,但协作翻译的进度 ...
- iOS Swift-元组tuples(The Swift Programming Language)
iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...
- iOS Swift-控制流(The Swift Programming Language)
iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...
随机推荐
- Python 3基础教程14-在文件尾部更新内容
本文介绍在一个已经存在的文件尾部添加内容,还是用到write方法. 这里exampleFile.txt是前面文件创建的文件,里面有两行文字.
- Python 3基础教程3-数学运算
本文来介绍下Python中的常见数学运算,其实和其他语言一样,加减乘除语法差不多,这里注意下Python中指数的表示方法. # 这里介绍 常见的数学运算 # 加法print(5 + 8) # 减法pr ...
- selenium初识(一)
Selenium是一个开源的便携式的自动化软件测试工具,用于测试web应用程序.有能力在不同浏览器和操作系统运行.它是一套工具,帮助我们有效地给予web应用程序的自动化. Selenium分为以下几个 ...
- python-使用pip安装第三方库报UnicodeDecodeError: 'utf8' codec can't decode byte 0xcb in position 7: invalid continuation byte 错误解决方案
在python 的安装目录下找到Lib\ntpath.py文件,找到def join(path, *paths):方法,添加如下两行语句: reload(sys) sys.setdefaultenco ...
- Unity插件
1.2D Toolkit 如果过去你一直从事3D游戏开发,最近想转做2D游戏,最好尝试一下2D Toolkit.2D Toolkit是一款2D开发组件,它具有很强的灵活性和适应性,能够让开发者在Uni ...
- python 多版本的兼容
1.针对linux版本 linux版本的话,首先调用whereis python 来获取到多版本的路径. root@Ulord-14:~# whereis pythonpython: /usr/bin ...
- 斐波那契数列的三种C++实现及时间复杂度分析
本文介绍了斐波那契数列的三种C++实现并详细地分析了时间复杂度. 斐波那契数列定义:F(1)=1, F(2)=1, F(n)=F(n-1) + F(n-2) (n>2) 如何计算斐波那契数 F( ...
- hdu1877进制转换
#include <stdio.h> int m; void Ck(int n) { if(n>=m) Ck(n/m); printf("%d",n%m); } ...
- css控制文字模糊
*{ color: transparent; text-shadow: #111 0 0 5px; }
- vmware中linux虚拟机使用NAT模式不能连接外网解决
linux虚拟机一直配置的桥接模式,今天改成NAT模式发现不能上外网 环境:VMware12,CentOS 6.8,NAT模式 ①电脑实际ip:192.168.1.100 ②NAT使用虚拟网卡网关: ...