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基础教程2-打印语句和字符串
本文介绍Python 3中的打印语句和字符串使用,具体练习请看下面的demo.py print ('Hello Python 3!') """文本讲打印语句和字符串打印语 ...
- 【转载】总结使用Unity3D优化游戏运行性能的经验
流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow Blade>已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目标. 以下是我们在紧凑的优化过程中 ...
- echarts 柱状图下钻功能
var drillDown = { getOption : function () { var option = null; option = { title: { text: ' ...
- 如何将自己写的代码上传到github上
忙活了一下午终于成功把代码上传到github上. 接下来就是我上传代码的步骤: ①首先注册github账号,登录,创建新仓库 ,点击+,点击new repository 得到如下页面,填写仓库名,自己 ...
- ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory
这是在python中使用caffe产生的错误. 程序很普通: #-*-coding=utf-8-*- import numpy as npimport matplotlib.pyplot as plt ...
- CentOS 6.3下安装Vsftp,虚拟用户
CentOS 6.3下安装Vsftp,虚拟用户一.安装:1.安装Vsftpd服务相关部件:[root@linuxidc.com ~]# yum install vsftpd*Dependencies ...
- Java String.intern()_学习笔记
参考:https://www.jianshu.com/p/0d1c003d2ff5 String.intern() String.intern()是native方法,底层调用c++中的StringTa ...
- 【BestCoder 1st Anniversary】
AB题都是签到题.... C 题意: 有一串数列,An=3*n*(n-1)+1 然后要从A数列中选取尽量少个数(可重复),使得Sum(An)=m 题解: 贪心地想,能拿大就拿大很明显就是错的...[哪 ...
- 如何设置两个AD域控制器
目的:这要为了测试,哈哈哈哈. 其实是为了AD域控的高可用性.一个域控down了,另一个可以顶上去. 如何设置:参考http://lgzeng2360.blog.51cto.com/275998/10 ...
- 百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统
这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前 ...