Swift-关键字坑

关键字介绍

  • Public:被Public修饰的可以在其他作用域被访问,可以在其他作用域被继承或者override(重写)

  • final:在任何地方都不能被重写

  • fileprivate:在swift3中fileprivate修饰表示被修饰的方法、属性访问权限为文件内私有

  • private:在swift3中private修饰的属性,方法表示真正的私有,离开了这个类或者结构体的作用域外面就无法访问

  • required:在类的构造器前添加,表明所有该类的子类必须实现该构造器

  • override:子类如果需要重写父类的方法,需在方法前加上override修饰

  • convenience:便利构造器需要在init关键字之前用convenience修饰

  • class : 用来声明一个类

  • enum : 用来声明一个枚举

  • init : 相对于类的释构方法的修饰。

  • deinit : 相对于类的释构方法的修饰。对于类的构造和释构在swift 中需要使用关键词来修饰,而很多高级语言并不需要特别的指定,便C++ 只需类名与构造函数名相同就可以,不需要额外的关键词。

  • extension : 扩展.类似于OC的categories.

     1. Swift 中的可以扩展以下几个:
     2. 添加计算型属性和计算静态属性
     3. 定义实例方法和类型方法
     4. 提供新的构造器
     5. 定义下标
     6. 定义和使用新的嵌套类型
     7. 使一个已有类型符合某个接口
    
  • let : 声明一个常量. 类似于const

  • protocol : 协议.也可以叫接口.这个往往在很多高级语言中不能多重继承的情况下使用协议是一个比较好的多态方式。

  • static : 声明静态变量或者函数

  • struct : 声明定义一个结构体

  • subscript : 下标索引修饰.可以让class、struct、以及enum使用下标访问内部的值

  • typealias : 为此类型声明一个别名.和 typedef类似.

  • break : 跳出循环.一般在控制流中使用,比如 for . while switch等语句

  • case : switch的选择分支.

  • continue : 跳过本次循环,继续执行后面的循环.

  • in : 范围或集合操作,多用于遍历.

  • fallthrough : swift语言特性switch语句的break可以忽略不写,满足条件时直接跳出循环.fallthrough的作用就是执行完当前case,继续执行下面的case.类似于其它语言中省去break里,会继续往后一个case跑,直到碰到break或default才完成的效果.

    switch integerToDescribe {  
    case 1, 3, 5, 7, 11, 13, 17, 19:  
        description += " a prime number, and also";  
        fallthrough      // 执行到此并不跳出循环,而是继续执行case5
    case 5:  
        description += " an integer"    // 执行到这一步,跳出循环
    default :  
        description += " finished"  
    }
    
  • where : 用于条件判断,和数据库查询时的where 'id > 10'这样功能. swift语言的特性.OC中并没有.

    let yetAnotherPoint = (1, -1)  
    switch yetAnotherPoint {  
    case let (x, y) where x == y:  
    println("(\\(x), \\(y)) is on the line x == y")  
    case let (x, y) where x == -y:  
    println("(\\(x), \\(y)) is on the line x == -y")  
    case let (x, y):  
    println("(\\(x), \\(y)) is just some arbitrary point")
    

当switch的条件满足where 后面的条件时,才执行语句。

  • is & as : is一般用于对一些变量的类型做判断.类似于OC中的isKindClass. as 与强制转换含义雷同.

    for view : AnyObject in self.view.subviews  
    {  
      if view is UIButton  
      {  
          let btn = view as UIButton;  
          println(btn)  
      }  
    }
    
  • dynamicType : 获取对象的动态类型,即运行时的实际类型,而非代码指定或编译器看到的类型

    __COLUMN__: 列号,
    __FILE__:路径,
    __FUNCTION__: 函数,
    __LINE__ : 行号
    
  • associativity: 运算符的结合性

  • inout : inout作为函数声明时,引用传值的关键字。但是在调用的时候引用的是地址,所以在引用的时候要加上 &,例如:

    func test(inout a :Int , inout b :Int)
    {
        // 函数内相关操作 
    }
    var  num1 = 3
    var  num2 = 10
    test(&num1,&num2)
    
  • willSet 和 didSet: willSet 和 didSet的作用是对赋值过程前后附加额外的操作
    可以看做是捕获状态然后做操作,在将要赋值的时候和已经赋值的时候做相 关操作

  • mutating : 写在func前面,以便于让func可以修改struct和protocol的extension中的成员的值。 如果func前面不加mutating,struct和protocol的extension中的成员的值便被保护起来,不能修改

  • class var: 在swift中对于enum和struct来说支持用static关键字来标示静态变量,
    但是对于class成员来说,只能以class var的方式返回一个只读值。例如:

    struct SomeStructure { 
    static var storedTypeProperty = "Some value." 
    static var computedTypeProperty: Int { // return an Int value here 
    }
    }
    enum SomeEnumeration { 
    static var storedTypeProperty = "Some value." 
      static var computedTypeProperty: Int {
         // return an Int value here 
      }
    }
    class SomeClass { 
        class var computedTypeProperty: Int { 
         }
    }
    

    这样其实很好的区分了struct和class的功能,
    不像C# 抓来一个随便用,但相对于oc来讲其实是弱化了界限,
    如果你想在class中搞一个非只读的静态变量出来,可以和struct进行配合。

  • convenience : convenience用来进行方便的初始化,就相当于构造函数重载。
    对于class来讲,默认或指定的初始化方法作为所谓的Designated初始化。
    若重载的初始化需要调用Designated初始化则将它作为convenience初始化,在方法前要加上convenience关键字。

    class Figure{  
       var name:String! 
       var nikname:String? 
       init(){   
          name = "John" 
       } 
      convenience init(name:String!,nikname:String!) {
           self.init() self.name = name self.nikname = nikname
      }
    }
    
  • precedence : 运算的优先级,越高的话优先进行计算。swift 中乘法和除法的优先级是 150 ,加法和减法的优先级是 140 ,这里我们定义点积的优先级为 160 ,就是说应该早于普通的乘除进行运算。

  • unowned, unowned(safe), unowned(unsafe):无宿主引用。

  • infix: 表示要定义的是一个中位操作符,即前后都是输入

  • defer: 用来包裹一段代码,这个代码块将会在当前作用域结束的时候被调用。这通常被用来对当前的代码进行一些清理工作,比如关闭打开的文件等。
    可以在同一个作用域中指定多个 defer
    代码块,在当前作用域结束时,它们会以相反的顺序被调用,即先定义的后执行,后定义的先执行。

  • guard : 当某些条件不满足的情况下,跳出作用域.

    func testFunc(input:Int) {
       guard input < 10 else  {
             print("Input must < 10") 
             return
        }
        print("Input is \\(input)")}
        testFunc(1)
        testFunc(11)
    

    与if用法一样,但是作用与if相反.相比if来说,guard有一个好处:如果不使用return,break,continue,throw跳出当前作用域,编译器会报错.所以,对那些对条件要求十分严格的地方,guard是不二之选。guard也可以使用可选绑定(Optional Binding)也就是 guard let 的格式

    func testMathFunc(input:Int?){
      guard let _ = input else  { 
           print("Input cannot be nil") 
           return
        }
    }
    testMathFunc(nil)
    

转载自

你可能感兴趣的:(Swift-关键字坑)