swift3 与 OC 语法区别

一、Swift还增长了Objective-C中没有的类型好比元组(Tuple)。swift

元组可让你建立或者传递一组数据,好比做为函数的返回值时,你能够用一个元组能够返回多个值。数据结构

元组(tuples)把多个值组合成一个复合值。元组内的值可使任意类型,并不要求是相同类型。闭包

//能够经过下标来访问元组中的单个元素
let http404Error =(404,"Not Found") println("The status code is \(http404Error.0)")
//给元组中的元素命名后,你能够经过名字来获取这些元素的值 let http200Status
=(statusCode: 200,description: "OK") println("The status code is \(http200Status.statusCode)")

注意:元组在临时组织值的时候颇有用,可是并不适合建立复杂的数据结构。若是你的数据结构并非临时使用,请使用类或者结构体而不是元组。async

 

二、Swift还增长了可选(Optional)类型,用于处理值缺失的状况。ide

Swift定义的常量和变量是没有默认值的,因此引入了可选的概念,用?修饰变量,标示该变量的值可能为空也可能为某个值,而后获取的时候用!强制解析,此时必须有值,不然报运行时错误。函数

三、常量的值一旦设定就不能改变,而变量的值能够随意更改。常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。所谓改变,对于基本数据类型而言,值改变就是改变,而对于引用数据类型而言,指针指向改变才是改变。spa

四、类型别名(type aliases)就是给现有类型定义另外一个名字。你可使用typealias关键字来定义类型别名。指针

五、属性监视器code

willSet在设置新的值以前调用server

didSet在新的值被设置以后当即调用

六、继承

若是子类实现和父类相同的方法或者属性就是重写。必须用override关键字代表。

防止重写,你能够经过把方法,属性或附属脚本标记为final来防止它们被重写。

七、构造方法

与Objective-C中的构造器不一样,Swift的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。

构造器分为指定构造器和便利构造器,原则:指定构造器是向上调用的,便利构造器是横向调用的。

规则1:指定构造器必须调用其父类的指定构造器

规则2:便利构造器必须调用同一类中调用的其余构造器

规则3:便利构造器必须以调用一个指定构造器结束

//指定构造器(默认构造方法),由于父类也有该方法,因此用override

override init() {
  super.init()
  print("Student init")
}

//指定构造器(自定义构造方法,父类没有该方法,不须要override)
init(size:Double) {
  super.init(size: size)
  print("Student init with size")
}

//便利构造器(使用关键词convenience,须要调用本身的构造方法)
convenience init(size:Double,friendNums:Double){
  self.init(size:size)
  self.friendNums = friendNums
}

八、类扩展,至关于OC分类

添加计算型属性和计算静态属性

注意:扩展能够添加新的计算属性,可是不能够添加存储属性,也不能够向已有属性添加属性观测器(property observers)

定义实例方法和类型方法

提供新的构造器

定义下标

定义和使用新的嵌套类型

使一个已有类型符合某个接口

九、循环引用的问题

使用弱引用weak和无主引用unowned修饰一方变量。

两个属性的值均可能是nil,并有可能产生强引用环。这种场景下适合使用弱引用。

var a:A?
weak b:B?

 

一个属性能够是nil,另一个属性不容许是nil,并有可能产生强引用环。这种场景下适合使用无主引用。

var a:A?
unowned b:B
override init(){
  self.b = B()
}

两个属性都必须有值,且初始化完成后不能为nil。这种场景下,则要一个类用无主引用属性,另外一个类用隐式展开的可选属性。

var a:A!
override init(){
  self.a = A()
}

unowned b:B
override init(){
  self.b = B()
}

 

在oc中,咱们须要在代码块用到self时,能够直接把self付给其余变量,而后在块中使用完毕后制空,或者像下面弱引用self来避免循环引用:

__weak typeof(self) weakSelf = self;

在swift中

//这里用gcd举例很差,毕竟系统的块不会形成循环引用,这里就勉强的学一下怎么改吧
dispatch_async(dispatch_get_global_queue(0, 0)) {[unowned self] () -> Void in
          self.view
          //添加本身的代码
}

 

 

十、检查类型

用类型检查操做符(is)来检查一个实例是否属于特定子类型。

某类型的一个常量或变量可能在幕后实际上属于一个子类。你能够相信,上面就是这种状况。你能够尝试向下转到它的子类型,用类型转换操做符(as)

若是强制转型确定成功,可使用as!,若是使用as?,那么返回结果成功则为该转的类型,失败则为空,此时可使用if let来接收判断。

十一、AnyObject

AnyObject相似于OC中的id类型,表示任意的class的实例对象,可是在Swift中,例如咱们常见的String和Array都变为结构体了,并且在Swift3.0中,更多的类型或者枚举被写为结构体了,AnyObject的适用范围变相被削弱了,因此在Swift3.0的API中曾经许多AnyOjbect的类型被替换为Any了。

AnyObject的自动类型转换
OCNSArray里面只能保存对象类型, 不能添加基本数据类型,如枚举、结构体等.
Swfit里面将Array的元素类型声明成 AnyObject,swift会自动将基本数据类型123转换为NSNumber对象类型。

let array = ["123",123]

Any 能够表示任何类型,包括函数类型、基本数据类型。

let a:[Any] = ["123",123]

AnyClass: 表示任意类的元类型.任意类的类型都隐式遵照这个协议.

public typealias AnyClass = AnyObject.Type

十二、闭包

Swift中的闭包与C和Objective-C中的blocks有点相似。

闭包表达式语法

{(parameters)-> returnType in
    statements
}

1三、在swif中的互斥锁

  • oc中的互斥锁:
@synchronized(self) {
    //须要执行的代码块
}
  • swift中的互斥锁
objc_sync_enter(self)
//须要执行的代码块
objc_sync_exit(self)
相关文章
相关标签/搜索