zoukankan      html  css  js  c++  java
  • 初探swift语言的学习笔记七(swift 的关健词)

    每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词:

        关键词:

    用来声明的:

    “ class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var.”

    用于子句的:

    “ break, case, continue, default, do, else, fallthrough, if, in, for, return, switch, where, while.”

    表达式和类型的:

    “ as, dynamicType, is, new, super, self, __COLUMN__, __FILE__, __FUNCTION__, __LINE__”

    //特殊语境使用的:

    “didSet, get, inout, mutating, override, set, unowned, unowned(safe), unowned(unsafe), weak , willSet”

    class

    用来定义一个类,相信大家并不陌生。

    如果定义一个汽车类

    1. class Car  
    2. {  
    3.       init()  
    4.       {  
    5.             //to do init something.  
    6.        }  
    7. }  

    init

    相对于类的构造方法的修饰。

    deinit

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

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

    enum

     枚举类型的声明,这个与很多语方都相通。

    extension

    扩展,有点像oc中的categories 。

    Swift 中的可以扩展以下几个:
    添加计算型属性和计算静态属性
    定义实例方法和类型方法
    提供新的构造器
    定义下标
    定义和使用新的嵌套类型
    使一个已有类型符合某个接口

    如下面扩展字符串:

    1. extension String{  
    2.     struct _Dummy {  
    3.         var idxVal: Int  
    4.         var _padding: Int  
    5.         var _padding2: Int  
    6.         var _padding3: Int  
    7.     }  
    8.     //过虑出数字  
    9.     func fitlerCharater() -> String  
    10.     {  
    11.         var numberstr : String = ""  
    12.         for character in self  
    13.         {  
    14.             let s :String = String(character)  
    15.               
    16.             //println(s.toInt())  
    17.             if let hs = s.toInt()  
    18.             {  
    19.                 numberstr += character  
    20.             }  
    21.         }  
    22.         return numberstr  
    23.     }  
    24.       
    25.     //扩展使用下标访问  
    26.     subscript (i: Int) -> Character {  
    27.         var dummy: _Dummy = reinterpretCast(i >= 0 ? self.startIndex : self.endIndex)  
    28.             dummy.idxVal += i  
    29.             let idx: String.Index = reinterpretCast(dummy)  
    30.             return self[idx]  
    31.     }  
    32.       
    33.     //扩展使用Range访问  
    34.     subscript (subRange: Range<Int>) -> String {  
    35.         var start: _Dummy = reinterpretCast(self.startIndex)  
    36.             var end = start  
    37.             start.idxVal = subRange._startIndex  
    38.             end.idxVal = subRange._endIndex  
    39.             let startIndex: String.Index = reinterpretCast(start)  
    40.             let endIndex: String.Index = reinterpretCast(end)  
    41.             return self[startIndex..endIndex]  
    42.     }  
    43. }  


    测试:

    1. func testExtension()  
    2. {  
    3.     var str : String = "1234ab5国6cd7中8i90"  
    4.     println(str.fitlerCharater())  
    5.       
    6.     let china: String = "china operating system public to 世界"  
    7.     println("使用下标索引访问第13个字符 (china[13])")  
    8.     println("使用负号下标即变为从右往左访问字符 (china[-1])")  
    9.     println("使用负号下标即变为从右往左访问字符 (china[-2])")  
    10.     println("使用下标Range来访问范围 (china[2...6])")  
    11.     dump(china[1..5], name: "china[1:4]")              //使用dump输出  
    12.     dump(china[10...13], name: "china[10:13]")  
    13. }  


    输出:

    1. 1234567890  
    2. 使用下标索引访问第13个字符 n  
    3. 使用负号下标即变为从右往左访问字符 界  
    4. 使用负号下标即变为从右往左访问字符 世  
    5. 使用下标Range来访问范围 ina o  
    6. - china[1:4]: hina  
    7. - china[10:13]: atin  


    func

     用来修饰函数的关键词。

    import

     导入头文件,相信大家都不陌生,但在swift 中好像被用来导入包,如import UIKit。 因为swift中没有了头文件的概念。

    let

    用来修改某一常量的关键词。像const 限定差不多

    var

    用来声明变量。

    protocol

    协议,也有称为接口,这个往往在很多高级语言中不能多重继承的情况下使用协议是一个比较好的多态方式。

    static

    用来修饰变量或函数为静态

    struct

    用来修饰结构体。

    subscript

    下标修饰,可以使类(class),结构体(struct),枚举(enum) 使用下标访问。

    1. class Garage  
    2. {  
    3.     var products : String[] = Array()  
    4.       
    5.     subscript(index:Int) -> String  
    6.     {  
    7.         get  
    8.         {  
    9.             return products[index]  
    10.         }  
    11.           
    12.         set  
    13.         {  
    14.             if index < products.count  //&& !products.isEmpty  
    15.             {  
    16.                 products[index] = newValue  
    17.             }  
    18.             else  
    19.             {  
    20.                 products.append(newValue)  
    21.             }  
    22.               
    23.         }  
    24.     }  
    25. }  


    测试:

    1. func testSubscript()  
    2. {  
    3.     var garage = Garage()  
    4.     garage[0] = "A"  
    5.     garage[1] = "B"  
    6.     garage[2] = "C"  
    7.     garage[3] = "D"  
    8.     garage[2] = "CC"  
    9.       
    10.     println("index 1 = (garage[0]) ,index 2 = (garage[1]),index 3 = (garage[2]) ,index 4 = (garage[3])")  
    11. }  


    输出

    1. index 1 = A ,index 2 = B,index 3 = CC ,index 4 = D  

    typealias

    类型别名,就像typedef一样。借typedef  unsigned long int    UInt64 

    同样在swift中也可能自定义类型。

    break

    跳出循环,通常用于for,while,do-while,switch 

    case

    case相信大家并不陌生,常在switch中使用,但如今在swift中多了一个地方使用哪就是枚举类型。

    continue

    跳过本次循环,继续往后执行。

    default

    缺省声明。常见在switch中。

    do, else,if, for, return, switch, while

    这几个就不用多说了,越说越混。

    in

    范围或集合操作

    1. let str = "123456"  
    2. for c in str  
    3. {  
    4.      println(c)  
    5. }  


    fallthrough

    由于swift中的switch语句中可以省去了break的写法,但在其它语言中省去break里,会继续往后一个case跑,直到碰到break或default才完成。在这里fallthrough就如同其它语言中忘记写break一样的功效。

    1. let integerToDescribe = 1  
    2. var description = "The number (integerToDescribe) is"  
    3. switch integerToDescribe {  
    4. case 1, 3, 5, 7, 11, 13, 17, 19:  
    5.     description += " a prime number, and also";  
    6.     fallthrough  
    7. case 5:  
    8.     description += " an integer"  
    9. default :  
    10.     description += " finished"  
    11. }  
    12.   
    13. println(description)  


    输出:

    1. The number 1 is a prime number, and also an integer  

    where

    swift中引入了where 来进行条件判断。

    1. let yetAnotherPoint = (1, -1)  
    2. switch yetAnotherPoint {  
    3. case let (x, y) where x == y:  
    4. println("((x), (y)) is on the line x == y")  
    5. case let (x, y) where x == -y:  
    6. println("((x), (y)) is on the line x == -y")  
    7. case let (x, y):  
    8. println("((x), (y)) is just some arbitrary point")  
    9. }  


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

    is

    as

    is 常用于对某变量类型的判断,就像OC中 isKindClass ,as 就有点像强制类型转换的意思了。

    1. for view : AnyObject in self.view.subviews  
    2. {  
    3.     if view is UIButton  
    4.     {  
    5.         let btn = view as UIButton;  
    6.         println(btn)  
    7.     }  
    8. }  


    OC的写法:

    1. for (UIView *view  in self.view.subviews)  
    2. {  
    3.       if ([view isKindOfClass:[UIButton class]])         //is 操作  
    4.      {  
    5.              UIButton *btn =(UIButton *)view             //as 操作  
    6.       }  
    7. }  

     

    super

    基类的关键语,通常称父类

    __COLUMN__, __FILE__, __FUNCTION__, __LINE__

    是不是有点像宏定义啊。

    1. println(__COLUMN__ ,__FILE__, __FUNCTION__, __LINE__)  


    输出:

    1. (17, /Users/apple/Desktop/swiftDemo/swiftDemo/ViewController.swift, viewDidLoad(), 62)  


    set,get

    常用于类属性的setter getter操作。

    willSet,didSet

    在swift中对set操作进行了扩展,willset 在set新值成功前发生,didset在设置新值成功后发生。

    inout

    对函数参数作为输出参数进行修饰。

    1. func swapTwoInts(inout a: Int, inout b: Int) {  
    2.     let temporaryA = a  
    3.     a = b  
    4.     b = temporaryA  
    5. }  

    mutating

    具体不是很理解,好像是专为结构体使用而设置的变体声明

    1. protocol ExampleProtocol {  
    2.     var simpleDescription: String { get }  
    3.     mutating func adjust()  
    4. }  
    5.   
    6. class SimpleClass: ExampleProtocol {  
    7.     var simpleDescription: String = "A very simple class."  
    8.     func adjust() {  
    9.         simpleDescription += "  Now 100% adjusted."  
    10.     }  
    11. }  
    12.   
    13.   
    14. struct SimpleStructure: ExampleProtocol {  
    15.     var simpleDescription: String = "A simple structure"  
    16.     mutating func adjust() {                //如果去除mutating 报Could not find an overload for '+=' that accepts the supplied arguments  
    17.         simpleDescription += " (adjusted)"  
    18.     }  
    19. }  

    测试

    1. func testMutating()  
    2. {  
    3.     var a = SimpleClass()  
    4.     a.adjust()  
    5.     let aDescription = a.simpleDescription  
    6.     println(aDescription)  
    7.       
    8.     var b = SimpleStructure()  
    9.     b.adjust()  
    10.     let bDescription = b.simpleDescription  
    11.     println(bDescription)  
    12. }  

    override
    父子类之间的函数重写,即复盖。

    unowned, unowned(safe), unowned(unsafe)

    无宿主引用。

    [unowned self] 或[unowned(safe) self] 或[unowned(unsafe) self]

    weak

    弱引用,使得对象不会被持续占有

  • 相关阅读:
    10个大数据领域的杰出公司
    面向对象下面几步
    $response->decoded_content; 和$response->content; 乱码问题
    netty新建连接并发数很小的case
    与eclipse集成的管理zookeeper工具
    zookeeper集群搭建
    用 Flask 来写个轻博客 (22) — 实现博客文章的添加和编辑页面
    perl 对象
    业务人员自助BI分析不够用,还要自助数据准备?
    业务人员自助BI分析不够用,还要自助数据准备?
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5072266.html
Copyright © 2011-2022 走看看