首先创建swift的工程需要注意:
1>工程名不能使用swift ,会影响编译
2>工程名不能使用 "中文 + 数字 " 如:项目01 , 这样是不行的
其次介绍一下swift 与 OC 的简单区别:
1> OC程序入口是 main.m 里的一些代码,而swift 的程序入口是@UIApplicationMain
2> OC的类后缀名是.h 和 .m , 而 swift 只有一个文件,后缀名是.swift
3> OC的类是以@interface @end开始和结尾的; 而swift 是以class声明类 以{ } 开始和结尾
4> OC 一句代码结束用分号表示结束;而swift 不需要分号,换行表示结束
swift的特点:
没有了main.m @UIApplicationMain是程序入口
只有.swift文件,没有.h/.m文件的区分
一个类就是一对{ },没有@implementation 和@end
语句结束没有分号
一般都是一行一句代码
打印使用print( )
swift中没有OC指针的概念
swift没有非零即真的概念,只有真或假
基础语法:
创建对象: 采用 ( )
let
var
swift的类型是可以自动推导的,通过等号右边的值来判断变量/常量的类型 (option键 + 单击查看他的类型)
建议:尽量不要用自动推导,系统会占用资源,导致Xcode的缓慢
可以通过 变量名:类型 来指定变量的类型
可选项
可选项很重要!!!!!!!!
1> 要么有值要么没值;
2>可选项不能直接运算,直接运算的话需要解包
1.可选项的概念: 在声明的变量/常量的类型后边 加一个问号; 注意: ?前边没有空格
2.可选项不能直接运行,运行的话,需要解包;解包可以理解成 将 Optional去掉
解包有2种方式: 强制解包(!);
强制解包存在问题:
1>当没有值的时候,会发生崩溃
2>
有值就获取到解包之后的值
非强制解包 (??): 1>如果?? 前边的可选项有值,则取可选项里的值(相当于解包);
2>如果 ?? 前边的可选项没有值, 则取 ?? 后边的 值
强制解包是可以使用的. 我们如何去使用呢? 我们在确保可选项肯定有值的时候,是可以强制解包的! 注意: 这个强制解包是 程序员自己认为的.并不是程序认为的,如果可选项没有值,还是会崩溃的
if let 语法 --- 针对于可选项
if let 新变量名 = 可选项 { 新变量名的作用域 }
1. 如果可选性为nil , 则if 语句 为 假
如果可选不为nil, 则if 语句 为 真
2. 新变量名为解包之后的值,作用域仅限于 { } 内
if let 多个可选项的请求
if [let 新变量名 = 可选项],[let 新变量名 = 可选项] , ... { 新变量名的作用域 }
[let 新变量名 = 可选项] 必须都为真,才可以进入if 后边的 { }
guard let 语法
与 if let 相反
guard let 新变量 = 可选项 else { }
1. 如果可选性为nil , 则执行 { } 里的代码
如果可选不为nil, 则不执行 { } 里的代码
2. 新变量为解包之后的值,作用域为 { } 后边
switch
swift中switch case任何类型都可以处理,而 OC 中switch case 只能处理整型
字符串
swift里的String是结构体,OC里的NSString是对象
String和NSString可以相互转化,很多时候我我们需要把String转换成NSString来调用NSString的方法
集合(数组 字典)
数组
let 用于修饰不可变数组,var用于修饰可变数组
函数
func <#name#>[方法名](<#parameters#>[参数列表]) -> <#return type#>[返回值] {
//方法体
}
闭包
是一个匿名函数,函数调用的时候执行,不调用肯定不执行
一般是作为回调使用.作为一个参数去使用
循环引用.有self是一个条件/造成强强引用
尾随闭包:闭包作为一个函数的最后一个参数
逃逸闭包:@escaping 它不能在当前线程销毁/管理,其他线程会使用这个闭包,我们需要使用@escaping来修饰一下;修饰的作用是方便闭包的管理
闭包的循环引用
破除循环引用只要破除其中一条线就可以解决
解决循环引用的方式:
1>类似于OC的弱化,弱化self
weak var weakSelf = self
2>采用swift解决循环引用的方式:在参数列表前加 [weak self]
self 会变成可选
weak相当于OC里的weak
//ARC;iOS5; 用weak修饰的变量,当变量被回收之后,原来的地址被置为nil;
//当我们再次访问的时候,返回给你一个nil,不会崩溃
client.loadData { [weak self] (info: String) in
print(self?.view)
}
3>采用swift解决循环引用的方式:在参数列表前加 [unowned self]
unowned相当于OC里的assign
//MRC ;iOS4;代理/基本数据类型 ,用assign修饰的变量,当变量被回收之后,原来的地址不会置为nil
//如果已经被释放的对象,再次访问的时候,会造成"野指针'访问
client.loadData { [unowned self] (info: String) in
print(self.view)
}
命名空间
swift有类似Java的命名空间
在自己的命名空间里就不用导入
用其他命名空间就要导入
构造函数
init在swift中叫做构造函数
swift的初始化方法是init
swift是先完成本类属性的初始化,在调用父类的构造方法,完成父类的初始化工作,与OC不一样
super.init是自动调用的,是可以默认不写的,但是建议写
重写和重载没有任何关系
重写:子类重写父类的方法,在子类中通过override关键字去扩展父类
//如果不重写父类的方法,本类会直接调用父类的方法
//如果本类中有一些必须初始化的属性,我们把默认的init方法注释之后,系统就不提供给我们默认的构造方法
重载:函数名相同,参数类型不同,参数名不同,参数个数不同
//重载在OC里不存在
//但是OC里存在initwithXXX:
//重载时面向对象的重要特点,好多语言都有重载!!!
KVC构造函数
KVC给属性赋值的原理:系统会在运行的时候,动态地调用我们的对象的setValue forKey 这个方法,来给属性赋值
在swift中,KVC构造函数中,要先完成父类对象的初始化,使用KVC实现字典转模型
get & set
只实现get叫计算型属性
实现了set get 叫存储属性