首先创建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来修饰一下;修饰的作用是方便闭包的管理


闭包的循环引用

swift代码怎么用 swift代码规则_swift代码怎么用


破除循环引用只要破除其中一条线就可以解决


解决循环引用的方式:


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  叫存储属性