美文网首页
Swift 基础(1) - Tips

Swift 基础(1) - Tips

作者: 静持大师 | 来源:发表于2017-03-25 03:00 被阅读4次

    一、关键词

    guard 使用场景
    使用 guard 来表达 “提前退出”的意图,有以下 使用场景 :
    
    在验证入口条件时
    在成功路径上提前退出
    在可选值解包时(拍扁 if let..else 金字塔)
    return 和 throw 中
    日志、崩溃和断言中
    
    fileprivate
    • 当前文件都可以使用
    • 比如说在函数前面加上这个关键字,当前文件都可以调用这个函数
    private:
    • 当前文件且在一个 extension 才可以使用
    filter: 条件满足
    • 用于选择数组元素中满足某种条件的元素
      intArray = [1, 3, 5]
      let filterArr = intArray.filter {
      // $0表示第一个参数、一次类推
      return $0 > 2
      }
      // [3, 5]
    map: 转换
    • map 是Array类的一个方法,我们可以使用它来对数组的每个元素进行转换
      let intArray = [1, 3, 5]
      let stringArr = intArray.map {
      return "($0)"
      }
      // ["1", "3", "5"]
    reduce: 计算
    • 把数组元素组合计算为一个值
      let intArray = [1, 3, 5]
      let result = intArray.reduce(0) {
      return $0 + $1
      }
      //9
    final:
    • 声明该类、函数、属性不可被继承或重写。

    二、协议代理

    • 为了避免循环引用, 代理用 weak 修饰, 但是weak 修饰会报错, 因为 weak 只修饰class, 所以协议需要继承自 class
    • struct enum 都可以遵守协议

    三、函数

    • 默认参数
    func makecoffee(type :String = "卡布奇诺") -> String {
        return "制作一杯\(type)咖啡。"
    }
    
    let coffee1 = makecoffee("拿铁")
    let coffee2 = makecoffee()
    
    • 可变参数
    func sum(numbers:Double...) -> Double {
        var total: Double = 0
        for number in numbers {
            total += number
        }
        return total
    }
    
    sum(100.0, 20, 30)
    sum(30, 80)
    
    • 引用类型(指针的传递)
    默认情况下,函数的参数是值传递.如果想改变外面的变量,则需要传递变量的地址
    必须是变量,因为需要在内部改变其值
    Swift提供的inout关键字就可以实现
    
    // 函数二:指针的传递
    func swap1(inout a : Int, inout b : Int) {
        let temp = a
        a = b
        b = temp
    
        print("a:\(a), b:\(b)")
    }
    
    swap1(&a, b: &b)
    print("a:\(a), b:\(b)")
    
    • 构造函数
      • 在自定义构造函数调用super.init之前,必须保证所有的属性被初始化,否则报 Property self.titles not initialized... 错误

    Extension

    • 在 extension 扩充构造函数,必须扩充便利构造函数
      • 必须在 init 前,加上convenience
      • 必须调用 self.init() 原有的某一个构造函数
        convenience init() {
        self.init()
        }

    闭包

    • @escaping : 闭包在另外一个闭包内使用需要用这个关键字

    十、其它

    class 和 struct 的区别
    • 相同点: 我们可以使用完全使用相同的语法规则来为 class 和 struct 定义属性、方法、下标操作、构造器,也可以通过extension 和 protocol 来提供某种功能。
    • 不同点
      • 与 struct 相比,class 还有如下功能:1、继承允许一个类继承另一个类的特性。2、类型转换允许在运行时检查和解释一个类实例的类型。3、引用计数允许对一个类的多次引用。4、析构器允许一个类实例释放任何其所被分配的资源。
      • 在 swift 中 struct 是值,而 class 是引用。所谓值,struct 一旦生成是不能变的,如果有一个方法改变了自己的属性,这个方法需要标为 mutating,修改时会产生一个新值去替代旧值(这一步可能会被编译器优化,并不一定会真的产生一个新 struct)。而 class 无论怎么传递都是同一个对象。
    try? 和 try!是什么意思
    • try?: 表示忽略异常,如果后面的表达式有异常抛出,会忽略,并且返回 nil。
    • try!: 断言这里不会抛异常。如果后面表达式有异常抛出,直接崩溃。
    public 和 open 的区别
    • 像构造函数等,只能用 public 不能用 open。enum、protocol 的声明也只能用 public。

    相关文章

      网友评论

          本文标题:Swift 基础(1) - Tips

          本文链接:https://www.haomeiwen.com/subject/otmnwttx.html