1.
removeLast() 删除最后一个字符
2.
for in {}:遍历集合/数组/字典(元组)
3.
集合:var letters = Set<Character>() -->泛型,int..之类的;构造函数指定泛型;
赋值 letter = ["....."]
集合是乱序的没有下标:
.contains("...") 是否包含....;
3.
字典:var name = [Int: String]() -->key and value;key可以是各种类型;
使用key访问:name[k1] = "...";
修改value:updateValue...forkey;
删除value:removeValue...forkey;
字典每一个元素的返回都是一个元组:k,v;
排序:sorted();
顺序:写入顺序和遍历顺序不一定相同;
4.
控制流:if ;while; switch; for in; repeat while;
for in: 可以使用范围-->for index in 1...5/1..<5; 不需要值时可用_,for _ in 1...num;
while/repeatwhile:...
if:...
switch: case一定要有一个语句体;case可匹配多个值,以及一个范围2...10;case可以匹配字符串/元组;可以绑定值并访问;可以使用where添加条件;
枚举,类和结构体,属性,方法,错误处理,类构造和解析,类的继承,嵌套和拓展,协议,封装,内存管理
面向对象的类型都可以:存储属性,计算属性,方法,下标,构造器,嵌套
1. 枚举 enum -- 一组有限值得集合
enum Season {
case Spring //case 后面的是实例
case Summer
case Fall
case Winter
case SSpring, SSummer //可以多实例
}
var weather: Season
weather = Season.Spring
可以指定枚举原始值
enum Season:Int{
case Spring = 0, Summer
}
获得原始值:rawValue
var mySeason = Season(rawValue: "S")
配对:
var weather = Season.Spring
switch weather{
case .Spring:
println(".....")
case .Summer:
......
}
关联值:(每个实例的关联值可以不同)
case Spring(attitude:Double, long:Double);
2. 类和结构体
结构体:一般不带方法;简单属性;
swift内结构体也可带方法;
结构体和枚举是值类型,类是引用类型;
等价 ===;(类类型的比较,引用同一个类实例);
不等价 !==;
等于 ==;(值是否相等);
存储属性,计算属性;
计算属性不是函数;
计算属性赋值需要set方法;
属性监视器:相应属性值的变化,每次属性被设置值都会调用;
willSet:在设置新的值之前;
didSet:新的值被设置之后调用;
方法的参数可以有一个局部名称(方法体内使用)和一个外部名称(在调用方法时使用);
异常处理:
do-catch
对于可能会抛出异常的操作,在前面要加上try;
如:
do{
try moveByX(20, y: 80)
}
catch ... {
...
}
一个子类只能拥有一个父类;
构造函数:(结构体和类都有)--注意:存储属性必须初始化
init
函数:
1. 关键词: func
2. 返回类型:->类型
无类型:忽略;->();->void;
函数类型:()->()
3. 形参:(形参列表)
没有形参空;多形参逗号隔开;
swift3.0:第一个参数的的外部形参名必须传入-->和书上不一样;
20161124
属性监视器 willSet didSet -> 不需要进行其他操作能自动检测;
方法的外部参数名?
错误处理:
throws--标识函数(可能抛出错误);
throw--抛出错误;
do-catch--错误处理;
defer--回收资源;
构造函数:
默认构造函数--无参;
指定构造函数--普通构造函数,在实例时必须调用其指定的构造函数(会覆盖掉系统默认的init);
便利构造函数--次要,辅助的构造函数(必须调用同一类中的其他构造函数/父类构造函数);
两段式构造函数--必须先创建并初始化完成以后才能通过self获取父类属性和调用方法;
继承:
“:”--后写父类名称;
重写父类的构造方法--override init(){};
override var description:String--描述对象属性(输出一些东西?);
定义构造函数时--对父类定义的属性的修改(设置)--需要调用父类的构造函数(super.init(....));
子类构造函数--必须向初始化自身定义属性再对父类属性进行设置(通过父类的构造函数);
父类的方法前加上final则子类无法重写该方法;
随机数--arc4random();