本文章纯粹是中文版《The Swift Programming Language》的学习笔记,所以绝大部分的内容都是文中有的。本文是本人的学习笔记,不是正式系统的记录。仅供参考

以下还是有很多没看懂、不确定的地方,我会以“存疑”的注解指出。

在此感谢中文版翻译者,这极大地加快了 Swift 的学习速度。


Reference:

原版:The Swift Programming Language
中文版:Swift 3 编程语言

几个无法分类的知识:
1 - Swift 不需要 main()函数,全局的第一段代码就是程序的入口。(存疑)
2 - Swift 中没有像 C 里面一样,非常明确地区别“声明”和“定义”的概念,全部的定义都是 “声明 + 定义”。

变量和常量

声明变量和常量

let aConstant = 42
let aConstantDouble : Double = 70   // 个人推荐

这样根据后面的值假定常量的类型。第一个例子里面,常量的类型就被设置成了Int。而第二个例子里面,虽然初始化值给的是一个Int,但是前面显式地说明了这是一个Double类型变量,所以这就是一个 Double 类型。

变量使用的是var

数组

在 Swift 里面,数组和关联数组成为了基本数据类型(在 Objective-C 里面是类),这大大简化了数据操作。
声明方式如下:

var shoppingList = ["catfish", "water", "popcorn"]
var shoppingList = [String]()

其中第一行是定义+初始值。第二行则不赋予初始值

关联数组(Dictionary)

var aDict = [:]
var aDict = [String:Float]()        // 推荐
var aListOfSalaries = ["Andrew": 10000.0,"Bob": 15000.0
]

上面第二种方法是详细的定义,具体限制了关联数组的 key 和 value 的类型。

控制流

基本上和 C 差不多,但不需要括号。不过有{}
条件操作有:ifswitch
循环操作有:for-inforwhilerepeat-while(不是 “do-while”)。

注意if的条件不循序用一个普通变量的值作为判断条件体了,只能布尔判断值。比如 “if some_value” 就是不合法的写法。

Optional 变量

如果声明变量的时候加入?,那么变量就是可选的(optional)
此时,变量可以置为 nil 值。

猜测这个方法就是相当于 C 里面的指针或者是其他方法中的引用(不确定)。

Arrar 和 Dictionary 中的 for-in

for number in someArray {...
}for (kind, number) in someDictionary {...
}

上面是使用 “for-in” 语法来 access array 和 dict 的方法。当然,array 和 dict 也可以嵌套。

循环

while n < 200 { ... }repeat { ... } while m < 100for i in 0..<4 {   }         // 表示 [0,4)
for i in 0...4 {   }         // 表示 [0,4]

函数和簇(闭包)

使用 func 来声明和定义函数:

func greeting (persion: String, day: String) -> String {...
}

可以使用 “元组”(tuple)来创建仅在该函数中使用的复合值(类似 struct):

func calculate (scores:[Int]) -> (min: Int, max: Int, sum: Int) {...
}

此外,可以把函数作为值返回:

func theFunc(number: Int) -> Int { ... }func retuanAFunc() -> (Int -> Int) {return theFunc
}

函数可以内嵌,内嵌的函数可以访问外部的变量:

func someFunc() -> Int {var error: Int = 0...func checkError() {if (...) { error = -1 }}...return error
}

对象和类

使用关键字 class 加花括号来构建一个类。与前面其他格式中花括号的作用一眼,都只是用来作为作用域。

var anInstance = aClass    // 很像 C++

使用点语法来访问类中的成员与方法。

初始化函数:init,接近 Objective-C 中的 init
反初始化函数:deinit,接近 Objective-C 中的 dealloc
成员函数重载:在 func 前面加上 override 关键字。

getter / setter

声明成员时,额外可以声明 getter / setter:

class SomeClass : FatherClass {var radius : Intinit (radius : Int) {super.init (radius)self.radius = radius}var circle : Double {get {...}set {...        // setter的参数如果未定义的话,默认叫做 `newValue`。也可以显式地定义。}}
}

willset 和 didSet

有时候,如果不需要自行实现 set / get操作,但需要在值更新前后操作的话,可以针对该值定义 willSetdidSet 函数:

var squre : Double {willSet: {...}
}

枚举和结构体

这其实是我最搞不懂的元素之一了,目测我以后只会用最基础的部分。
使用 enum 创建枚举。enum 可以包括函数:

enum PokerFace {case ace = 1            // 注意这里如果不赋初始值的话,默认是 1case two, three, four, five, six, seven, eight, nine, tencase jack, queen, kingfunc decription() -> String {switch self {case .ace:return "ace"case .jack:return "jack"case .queen:return "queen"case .king:return "king"default:return String (self.rawValue)        // Note}}
}

注意隐含的 rawValue 值。

可以用构造函数创建一个 enum 的实例:

let aRank = Rank (rawValue : 3)
let aRank = Rank (.three)

使用 struct 定义结构体:

struct Card_st {var rank : Rankvar suit : Suitfunc simpleDescription () -> String {return ...}
}

struct 的行为与 class 很类似,但传递时,struct 传递的是拷贝,而 class 传递的是引用
struct 也有 initializer

协议和扩展

协议

protocol ExampleProtocol {var simpleDescription: String {get}mutating func adjust ()
}

声明部分的两行分别代表一下意思:

  1. 有一个针对 simpleDescritpion 的 String 的 getter
  2. 声明一个函数:其中 mutating 关键字用在 struct 中,表示可以修改 struct 的内容。

class、struct 和 enum 都可以有协议。

声明一个类,表示符合某个协议,在冒号后面加就好了:

class SomeClass : ExampleProtocol {...
}

扩展

extansion Int: ExampleExtansion {...
}

上面表示为 Int 类型添加一个名为 “ExampleExtension” 的扩展。

此时你可以创建一个叫做 “ExampleProtocol” 的 Int 变量,这个时候, “ExampleExtension” 的语义就变成了 “添加了 ExampleExtension 扩展的 Int 类型”。这是的基本类型也好像类一样继承了。

错误处理

使用遵循 Error 协议的类型来表示错误,比如:

enum ExampleError : Error {case outOfPapercase noTonercase onFire
}

使用 throw 来抛出错误。使用 throws 标记可以抛出错误的函数:

func send (job : Int, toPrinter printerName : String) throws -> String {...if printerName == ... {throw ExampleError.noToner}return "..."
}

错误处理方法1:do-catch

do {...
} catch {print(error)        // 这个貌似是隐含的数据类型?不确定
}

错误处理方法2:do + 多个catch

do {...
} catch PrinterError.onFire {...
} catch let printerError as PrinterError {print ("Printer error: \(printerError).")
} catch {print(error)
}

错误处理方法3:try?
没明白

下一篇

Swift 个人学习笔记 - 02: 基础内容

Swift 个人学习笔记 - 01: A Swift Tour相关推荐

  1. SWIFT电文学习笔记

    SWIFT电文学习笔记 报文类型 用户报文 系统报文(System Message) 服务报文(Service Message) 错误码(Error Code) SWIFT电文结构 (1)报头Head ...

  2. RN学习笔记01:概述、特点与环境搭建

    RN学习笔记01:概述.特点与环境搭建 一.RN概述 React Native(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 Reac ...

  3. JavaWeb黑马旅游网-学习笔记01【准备工作】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  4. JavaWeb-综合案例(用户信息)-学习笔记01【列表查询】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  5. Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  6. Tomcat学习笔记01【Web相关概念、Tomcat基本操作】

    Java后端 学习路线 笔记汇总表[黑马程序员] Tomcat学习笔记01[Web相关概念.Tomcat基本操作][day01] Tomcat学习笔记02[Tomcat部署项目][day01] 目录 ...

  7. XML学习笔记01【xml_基础、xml_约束】

    Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 01 xml_基础 今日内容 ...

  8. Bootstrap学习笔记01【快速入门、栅格布局】

    Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...

  9. JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  10. HTML/CSS学习笔记01【概念介绍、基本标签】

    w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...

最新文章

  1. ISME:中科院微生物所揭示细菌利用光能新机制!
  2. 怎么为DNS大哥减轻压力?
  3. 将本地的MS SQL Server数据导入到远程服务器上
  4. Firebird数据库系统的开发团队
  5. BS-GX-017基于SSM实现的在线考试管理系统
  6. Cannot input a tensor of dimension other than 0 as a scalar argument
  7. IO模型(select, poll, epoll的区别和原理)
  8. 蓝桥杯-队列操作(java)
  9. canvas笔记-canvas适应浏览器(填充整个页面)
  10. 175. 组合两个表
  11. android 开启线程关闭对话框,java – 从后台线程的PopUp对话框Android
  12. 温暖的《北国之恋》_ing
  13. 架构师应该具备什么技能
  14. java集成kettle 8.2 获取转换的执行日志与步骤度量
  15. 转:衡量数据的离散程度
  16. Linux网络操作系统期末系统复习题
  17. 数字孪生快速建模研究案例
  18. python 爬虫 Form Data爬取穷游网的数据
  19. 零基础学习python第二课笔记
  20. 护眼灯对孩子眼睛好吗?推荐眼科医生推荐的台灯

热门文章

  1. java开源规则引擎比较_几款常用规则引擎的简单对比及演示
  2. 144显示器只有60_3199元34寸144Hz高刷新曲面带鱼屏显示器咋样?用过才知道
  3. arcgis dem栅格立体感_arcgis中DEM如何生成等高线
  4. python: 使用正则表达式的时候,传递参数的方法:
  5. Mysql占用CPU过高的时候,该从哪些方面下手进行优化?
  6. linux安装python的拓展包,linux 安装python拓展包pexpect
  7. s一般怎么称呼自己的m_上海平面设计工资一般是多少,我该怎么提升自己的平面设计能力?...
  8. 打造可降级的React服务端同构框架
  9. 完成的定义 Definition of Done
  10. IAR_STM32_BootLoader