zoukankan      html  css  js  c++  java
  • Swift语法笔记

    Guard

    guard是一种条件判断语句,可以类比if、assert。如果条件不符合,guard的else语句就运行,从而退出这个函数。

    具体写法如下:

    func fooGuard(x: Int?) {
        guard let x = x where x > 0 else {
            // 变量不符合条件判断时,执行下面代码
            return
        }
    
        // 使用x
        x.description
    }

    Subscripts

    Subscripts用于给类(class)自定义下标,下标使用subscript关键字,然后跟一个圆括号,里面是该下标的参数和参数类型(在实际使用中该参数就相当于数组的index和字典的key一样),最后有该下标的返回值类型。

    具体写法如下:

    subscript(row: Int, col: Int) -> T {
            get {
                assert(row >= 0 && row < tileNumber)
                assert(col >= 0 && col < tileNumber)
                return boardArray[row*tileNumber + col]
            }
            set {
                assert(row >= 0 && row < tileNumber)
                assert(col >= 0 && col < tileNumber)
                boardArray[row*tileNumber + col] = newValue
            }
        }

    如果你想定义一个只读的下标,那么可以不实现setter方法,并且可以省略getter方法的get关键字,编译器会判断出这是一个只读的下标。


    Unowned

    unowned和weak一样,可以用在防止循环引用的地方。区别在于:unowned 设置以后即使它原来引用的内容已经被释放了,它仍然会保持对被已经释放了的对象的一个 "无效的" 引用,它不能是 Optional 值,也不会被指向 nil。如果你尝试调用这个引用的方法或者访问成员属性的话,程序就会崩溃。而 weak 则友好一些,在引用的内容被释放后,标记为 weak 的成员将会自动地变成 nil (因此被标记为 @weak 的变量一定需要是 Optional 值)。关于两者使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用 unowned,如果存在被释放的可能,那就选择用 weak

    例如:

    lazy var printName: ()->() = {
        [weak self] in
        if let strongSelf = self {
            print("The name is (strongSelf.name)")
        }
    }

    如果我们可以确定在整个过程中 self 不会被释放的话,我们可以将上面的 weak 改为 unowned,这样就不再需要 strongSelf 的判断。

    lazy var printName: ()->() = {
        [unowned self] in
        print("The name is (self)")
    }

    详细教程见:http://swifter.tips/retain-cycle/


    Mutating

    在swift含三种类型(type):  structure ,  enumeration ,  class。

    其中structure和enumeration是值类型( value type ),class是引用类型( reference type ),与objective-c不同的是,structure和enumeration也可以拥有方法。

    虽然结构体和枚举可以定义自己的方法,但是默认情况下,实例方法中是不可以修改值类型的属性。为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating。

    具体写法如下:

    struct Point {
      var x = 0, y = 0
      
      mutating func moveXBy(x:Int,yBy y:Int) {
        self.x += x
        self.y += y
      }
    }

    If case

    是swift2.0新的匹配模式 但是要在xcode7环境编译

    //新增使用enumeration匹配 也就是枚举匹配方式
    if case .Some(let x) = someOptional {
        println("someOptional value is (x)") //如果为nil情况,不会输出东西,因为匹配的是Some!
    }
    //新增使用可选模式匹配
    if case let x? = someOptional {
        println("someOptional value is (x)") //不需要对x进行解包
    }
     let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
     // 匹配非nil值
     for case let number? in arrayOfOptionalInts {
        print("Found a (number)")
     }
     // 输出:
     // Found a 2
     // Found a 3
     // Found a 5    

    Final

    final 关键字可以用在 class,func 或者 var 前面进行修饰,表示不允许对该内容进行继承或者重写操作。

     

  • 相关阅读:
    青云黄允松:2016年是云计算市场最关键的一年
    知道创宇CTO杨冀龙:网络安全人才决定行业格局
    su 与 su
    如何进入单用户模式(CentOS6.9)
    在虚拟机中还原GHO镜像系统
    安装CentOS 7 文字版
    把typora改为微软雅黑+Consolas
    使用python操作文件实现购物车程序
    使用python操作json文本文件
    资源下载网址集合
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/5085238.html
Copyright © 2011-2022 走看看