1、swift创建类时只有一个文件(.swift),oc创建类时有两个文件(分.h跟.m)
2、swift中的实现代码全部开始于class 类名 : 父类(UICollectionViewCell) {}之中,OC实现代码开始于@implementationMyViewController @end之间。
3、swift实现协议直接跟在父类后面用逗号区分多个协议,OC中实现协议用<UITableViewDataSource,UITableViewDelegate>,并且要写在.h文件中。
4、swift中用let来声明一个常量(let maxCount = @"hello"),用var来声明一个变量(var maxCount : Int = 0)这边可以不用声明类型 = 后面跟上的数据初始值则可以声明这个类型,如果要声明类型则在常量名后面加上:Int(NSString)来表示数据类型。OC中用Static来声明一个常量static int aa = 0,声明变量直接使用int aa = 0。区别:swift中变量描述多了var定义,并且将变量类型定义放在后面(可省略),OC中变量定义放在最前面(不可省略)。
5、swift跟OC都有Int、Float、Double、String、Bool数据类型。swift有三种集合类型Array(数组类型,数据类型顺序添加),Set(数组类型、不可添加相同类型数据),Dictionary(字典类型、键值对)。OC中有NSArray、NSMutableArray(数组类型,可变或者不可变),NSDictionary、NSMutableDictionary(字典类型,不可变或者可变类型),NSMutableString(可变字符串类型)。
6、swift中override func viewDidLoad() {}方法等同于OC中的- (void)viewDidLoad 方法,都可以始化控制器中的一些数据,添加子控件等。区别:swift中这个方法获取的frame并不一定准确,所以不建议在这个方法约束子控件,override func viewWillAppear(animated: Bool) {}我们可以在这个方法里面做一些子控件的约束操作等。
7、override修饰的方法名表示重写父类的方法、像override func viewDidLoad() {}就是重写了父类UIViewController的viewDidLoad方法。@final修饰的方法不能被子类重写。
8、元组的用法:元组很类似OC中的数组,区别是元组中可以添加对象、或者c语言的常用类型(Int)型例如:var userZhangsan = ("Zhangsan", "张三", "越秀区清水濠小学", 9, "三年级", true),取值可以userZhangsan[0]取到"Zhangsan",在设计元组时不止添加值还可以对每个值添加对应的名称例如:var userInfo = (name:"Bannings",true, age:22),调用比较方便可以直接使用userInfo.name来取值。元组可以用var来修饰表示可变的元组,用let修饰的是不可变元组。元组也可以看做一种数据结构,可以当做参数或者返回值使用。
9、方法使用:func 类名(参数)->返回值。
例1:func initCollectionView() ->Void表示无参数无返回值的方法 。
例2:func collectionView(_collectionView:UICollectionView, numberOfItemsInSection section:Int) ->Int表示传入UICollectionView和Int类型的参数,传出Int类型返回值。
10、基本运算符:swift中一元、二元、三元运算符、赋值运算符、逻辑运算符(|| && !)基本跟OC用法一致,算术运算符(+、-、* /、%)基本跟OC一致,不过两个字符串拼接可以用+直接完成。
组合赋值运算符:var a =1,a +=2这个跟OC一样也是变成a = a + 2;比较运算符也是跟OC一致返回一个bool类型的值。元组也可以进行比较不过两个元组必须是相同格式的,按照顺序逐个比较大小。
闭区间运算符跟半闭区间运算符:for index in 1...5{}闭区间运算符从1循环到5,第一个元素必须小于最后一个元素。fori in 0..<count{}半闭区间运算符跟闭区间运算符一样,只是不包括最后一个元素。这边方便用于列表长度遍历。
11、swift中用let修饰的字符串是常量字符串不可变,var修饰的字符串是可变字符串,可以直接用+对两个字符串进行拼接,可用for in来遍历字符串中的每个字符,String(array)来将数组的每个元素合成一个字符串,可以用 append()方法将一个字符附加到一个字符串变量的尾部,
插入:调用 insert(_:at:)方法可以在一个字符串的指定索引插入一个字符,调用 insert(contentsOf:at:)方法可以在一个字符串的指定索引插入一个段字符串。
删除:调用 remove(at:)方法可以在一个字符串的指定索引删除一个字符,调用 removeSubrange(_:)方法可以在一个字符串的指定索引删除一个子字符串。
12、集合类型:
数组(Arrays)
Arrays表示是一个可以添加无序数据的集合,同样的Arrays也适合string一套的数据存储跟删除机制(insert(_:at:),remove(at:))。可以使用 enumerated()方法来进行数组遍历。enumerated()返回一个由每一个数据项索引值和数据值组成的元组。我们可以把这个元组分解成临时常量或者变量来进行遍历
集合(Sets)
集合(Set)用来存储相同类型并且没有确定顺序的值。当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。创建一个空的var letters =Set<Character>(),使用 contains(_:)方法去检查 Set中是否包含一个特定的值,可以在一个 for-in循环中遍历一个 Set中的所有值for genre in favoriteGenres {print("\(genre)")}
1、使用 intersection(_:)方法根据两个集合中都包含的值创建的一个新的集合。
2、使用 symmetricDifference(_:)方法根据在一个集合中但不在两个集合中的值创建一个新的集合。
3、使用 union(_:)方法根据两个集合的值创建一个新的集合。
4、使用 subtracting(_:)方法根据不在该集合中的值创建一个新的集合
字典(Dictionary)
初始化var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"],字典可以用airports["DUB"]下标来获取到对应的value值,我们可以使用 for-in循环来遍历某个字典中的键值对。每一个字典中的数据项都以 (key, value)元组形式返回,并且我们可以使用临时常量或者变量来分解这些元组:
for (airportCode, airportName) in airports {
print("\(airportCode): \(airportName)")
}
通过访问 keys或者 values属性,我们也可以遍历字典的键数组或者值数组。
13、控制流for in
正常for name in names {print("Hello, \(name)!")}遍历一个数组如果需要使用到数组中的元素可以定义个name临时变量来获取到对应的数据,如果不使用则用_代替name。
stride(from:0 to:60 by:3)可以跳过某个区间值,这个例子表示从0开始遍历 总共遍历到60,遍历一次跳过三个变成0,3,6...
判断if语句类似OC用法 if (跟上一个bool类型的数据){},在swift中Switch不仅仅可以用来判断整形类型,还可以用来判断Character字符类型(或者case"a","A":复合类型判断),还可以判断cash是否在一个区间内。
14、枚举enum
令枚举遵循 CaseIterable协议。Swift 会生成一个 allCases属性,用于表示一个包含枚举所有成员的集合
enum Beverage:CaseIterable{casecoffee,tea,juice}
let numberOfChoices = Beverage.allCases.count
枚举还可以定义一个元组的case类型
enum Barcode{
case upc(Int,Int,Int,Int)
case qrCode(String)
}
15、类和结构体:结构体和类有着相似的定义方式。你通过 struct关键字引入结构体,通过 class关键字引入类,并将它们的具体定义放在一对大括号中
struct SomeStructure{
// 在这里定义结构体
}
class SomeClass{
// 在这里定义类
}