zoukankan      html  css  js  c++  java
  • swift3 与 OC 语法区别

    1、Swift还增加了Objective-C中没有的类型比如元组(Tuple)。

    元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值。

    元组(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)")

    注意:元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。

    2、Swift还增加了可选(Optional)类型,用于处理值缺失的情况。

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

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

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

    5、属性监视器

    willSet在设置新的值之前调用

    didSet在新的值被设置之后立即调用

    6、继承

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

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

    7、构造方法

    与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
    }

    8、类扩展,相当于OC分类

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

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

    定义实例方法和类型方法

    提供新的构造器

    定义下标

    定义和使用新的嵌套类型

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

    9、循环引用的问题

    使用弱引用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
              //添加自己的代码
    }

    10、检查类型

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

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

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

    11、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

    12、闭包

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

    闭包表达式语法

    {(parameters)-> returnType in
        statements
    }

    13、在swif中的互斥锁

    • oc中的互斥锁:
    @synchronized(self) {
        //需要执行的代码块
    }
    • swift中的互斥锁
    objc_sync_enter(self)
    //需要执行的代码块
    objc_sync_exit(self)

     

     

  • 相关阅读:
    element-ui获取table行数据
    去掉输入框的边框以及在显示获取焦点时的边框+jq日期选择器
    需要ui的小伙伴看过来(这篇博客只有一个链接希望对大家有用)
    vue获取当前对象
    FlashFXP用到的功能
    VS Code做项目的笔记
    单点登陆
    idea中自动生成实体类
    VSCode安装
    数组排序
  • 原文地址:https://www.cnblogs.com/fengmin/p/6929337.html
Copyright © 2011-2022 走看看