开始
- 典型的语句如下:
print("hello")
print("world")
- 一行就是一个语句,换行是有意义的。
- 也可以一行写多个语句,不过要用分号分开。
- 也可以在每行后面写个分号,不过没什么用,可以兼容C/OC的语言习惯
- 一个语句可以拆分成多行,用于防止一行太长。但是要在一个合理的地方断。比如括号的地方就是个好地方。
print(
"world")
- 双反斜杠(//)表示注释一行。和C、OC一样。
- (/* ... */) 可以注释一段
- 大括号一般会换行对齐。但是也有写在一行的。语法上都可以。方便的话也可以写在一行。
- swift是编译型语言。必须先编译成机器语言。
- swift编译器非常严格。编译器给的警告也应该重视。
- swift给出的错误和警告,有的很重名,有的很垃圾(误导)。有时候给的错误提示不在真正发生错误的地方。所以有个办法就是把语句拆分成多行。这样更容易定位哪行出错了。
所有的东西都是对象?
- swift中任何东西都是对象。粗略的规定,一个对象就是你可以对它发消息的东西。消息,就是一种必要的指令。这样理解的话,任何东西都是对象。
- swift中,发消息的语法是“点”(dot-notation)
fido.bark()
rover.sit()
- 任何东西的意思就是说,语言原始的实体都能被发送消息。1看上去是基本数据类型,也是个对象,可以发消息,下面的是合法的。
let s = 1.description
- 在swift中,最终检测一个东西是不是对象的方法,就是看你是否能改变它。对象类型可以被扩展,意味着你可以对这个类型定义自己的方法。swift中的类型是可以扩展的。
- 所以swift中没有标量。所有的类型都是对象类型。
三种常用的对象类型
- swift有三种常用的对象类型。classes,cstucts,enums
- 三种类型的相似远大于不同
- struct,enum在oc和swift中是不同的。
变量
- 变量就是对象的名字。你可以想象成放对象的鞋盒子。对象可能被更改,被替换,但是变量名是不会变的。
- 变量需要先被声明。let 申明常量。var声明变量。声明常常伴随着初始化。
- 虽然说var显得灵活,但是知道不可改的时候,最好用let。首先能提高效率。
- 变量有类型,类型在声明的时候确定,不可修改。
- 变量有生命周期。
- 变量的类型约定大写字母开头。变量用小写字母开头。
函数
- 可执行语句不是在任何地方都可以执行的。要在函数体里执行。函数就是一堆可执行语句。函数的调用又是一个执行语句,这样又必须在某个地方调用。不用担心最开始的函数是谁在调用,你在写iOS的APP,系统就会有地方调用。
- 函数有名字,在定义时确定。
- swift有特别的规则,有个main.swift的文件,可以在最顶层执行。不在任何函数体里。可以用这个main文件,通常没必要。
swift文件结构
- swift中,文件是一个完整意义的单位。只有特定的东西才能在文件中。
- 模块导入语句
- 变量声明
- 函数声明
- 对象类型声明
- 模块是更上一层的单元。模块可以包含很多文件,他们可以互相调用。但是如果不导入的话,是不能互相看见的。
- 文件层级的变量声明是全局变量。在文件级别的函数声明是全局函数。
- 文件级别里不能直接放可执行代码。
- 可执行代码也不能放在类声明的大括号内。这是类声明的顶层。类声明可以包含函数声明。函数声明可包含可执行代码。
作用域和生命周期
- 作用域是说这个东西可以被别人看到。嵌套在别的东西里面的东西,也是嵌套继承作用域。可以看到自己的同级别和上一级别的东西。
- 模块范围是个作用域。文件范围是一个作用域。大括号是个作用域。
- 作用域是共享信息的重要方式。
- 东西都有生命周期。和作用域完全一致。声明周期在作用域内。
- 变量声明,函数声明,函数对象声明可以在任何大括号内。
对象成员
- 在对象类型中,(class,struct,enum)在顶层定义的东西有特殊的名字。大部分因为历史原因。变量称之为属性;函数称之为方法。
- 所有顶层中的,称之为对象的成员。成员都有特殊的签名。
命名空间
- 命名空间内部的东西不能被命名空间外部的东西直接访问。除非明确指出命名空间的名字。这样可以让同样的名字在不同的地方使用,而不会有冲突。
- 命名空间本身不提供安全和隐私,只是提供方便。
- 使用(.)点的方式来引用命名空间,其实和发消息是一个机制。发消息允许你看一个其他你不能看到的作用域。
模块
- 顶级的命名空间是模块。默认情况下,你的app是个模块因此也是个命名空间。
- frameworks也是模块,因此也是命名空间。
- 引入模块的时候,所有模块中的顶级声明都可以看到。
- 不要在自己的模块中定义和系统冲突的类。干不过他。
- swift自己也是在模块中定义的。称之为swift模块。通常隐含的导入了swift模块。像print这样的函数就是在这个模块中。
- swift模块顶级中包含了全局函数,操作符比如+,内置类型比如Int,内置结构比如String。
实例
- 对象类型有一个重要特性,可以被实例化。类定义只是说这类是什么样子,要有具体的对象,要造一个。
- 创建实例就类型加括号即可。
- 方法分为实例方法和类方法。属性也有类属性和实例属性。
为什么有实例
- 对象类型本身是个对象。可以对他发消息。
- 实例是类描述的反映,也是存储的空间。
- 实例不仅仅关乎属性的值,也关乎属性的生命周期。
- 实例是数据和代码的集合。代码是从类的定义中来。数据是单独的。
self
- 实例是一个对象,是消息的接收者。因此需要有个办法对自己发消息。于是就有了self。
- self就代表本身这个对象。可以省略写self。但是为了可读性,一般不会省略。而且有的时候你必须写self。
隐私
命名空间不是访问内部名字无敌的限制。但有些时候我们需要做些限制。
好的面向对象的设计需要有隐私设计。需要有办法让别的类无法访问无法看见不支持被看见的类的方法和属性。
声明为private的就可以。
-
一些保留字,private,class等,不能简单的作为变量的命名。要强制的话,需要加反点引号引起来。
class `func` { func `if`(){ let `class` = 1 } }
对象的属性和方法默认都是公有的。要搞成私有,用private
设计
- 面向对象程序设计是一门艺术
- 实际的开发过程中,很多类的设计都是Apple的。你不用去设计,只需要学习怎么用。
- 面向对象的设计必须建立在靠谱的自然对象基础上。然后是封装合适的方法和数据。运行的时候实例化,有合适的生命周期,恰当的暴露。
对象类型和API
- 程序常常有很少的全局函数和变量等。大部分是对象类型的定义,类定义之类的。这样更好的组织你的代码。
- 小结下对象:
- 封装功能;
- 维护数据
- 类可以做什么,用API封装。
实例创建,范围和生命周期
- swift中运行的通常是实例。要做事情先要对类进行实例化。默认情况下是没有实例的。需要自己造。造完之后放到一个变量中,生命周期和作用域都和这个变量一致。
- 实际的开发过程中,app有一些框架,启动的时候就有一些实例。
小结和结论
- 有类,有实例。
- 对象是组织代码的工具。
- 有些经典的书可以继续深入学习面向对象。重构;设计模式。