美文网首页
Swift记录

Swift记录

作者: 路在脚下了 | 来源:发表于2020-08-28 15:30 被阅读0次
    copy on write(写时复制):

    简单的说就是,只有当一个结构体发生了写入行为时才会有复制行为。具体的做法就是,在结构体内部用一个引用类型来存储实际的数据,在不进行写入操作的普通传递过程中,都是将内部的reference的应用计数+1,在进行写入操作时,对内部的reference做一次copy操作用来存储新的数据,防止和之前的reference产生意外的数据共享。

    Range Operations

    1...5   // 1, 2, 3, 4, 5
    1..<5   // 1, 2, 3, 4
    [2...]  // >=2 的数字
    [...2]  // <=2的数字
    
    

    // 全校学生
    let allStudents: [Student] = getSchoolStudents()
    
    map:用于映射,可以将一个列表转换为另外一个列表
    [1, 2, 3].map {"\($0)"}   // ["1", "2", "3"]
    allStudents.map { student in student.parent }
    

    flatMap:对序列内的元素进行展开

    ["Hi","Swift"].flatMap { $0 }  // ["H", "i", "S", "w", "i", "f", "t"]
    
    forEach: 对全部元素执行特定方法
    allStudents.forEach { std in print("score: \(std.score), name: \(std.name)") }
    
    sort和sorted:排序
    allStudents.sort { std1, std2 in std.score > std2.score }
    // 会产生新的排序数组
    let sortStudents =  allStudents.sorted { std1, std2 in std.score > std2.score }
    
    reduce:合并一个确定的序列,并返回单个值
    // 传入初始值0,然后根据后面{}的规则合并数组
    [1, 2, 3].reduce(0).{$0 + $1}  // 6
    
    filter:用于过滤, 可以筛选出想要的元素
    [1,3,5,7].filter{ $0 > 3}  // [5, 7]
    allStudents.filter { student in student.grade == 3 && student.class == 2 }
    
    合并使用
    let tmp2 = [1,3,5,7].filter{ $0 >= 3} .map{$0+1}.reduce(0){$0+$1}  // 18
    

    defer :就是 defer block 里的代码会在函数 return 之前执行。无论函数是从哪个分支 return 的,还是有 throw的,都会在代码块的最后执行defer block。

    权限控制关键字

    final:

    可以防止类被继承,还可以防止子类重写父类的属性、方法以及下标。需要注意的是,final修饰符只能用于类,不能修饰结构体和枚举,因为结构体和枚举只能遵循协议。

    • 修饰类,表明该类不能被其他类继承,也就是它没资格当父类。
    • 修饰类中的属性、方法和下标,但前提是该类并没有被final修饰过。
    • 不能修饰结构体和枚举。
    open和public

    这两个都用于在模块中声明需要对外界暴露的函数, 区别在于, public 修饰的类, 在模块外无法继承, 而 open 则可以任意继承, 公开度来说, public < open。

    static 和 class 修饰方法时的区别

    static 定义的方法不可以被子类继承, class 则可以。
    非class类型 一般 统一用 static 。例如 枚举 结构体
    protocol中 使用 static ,实现协议的 枚举 结构体 用 static
    class 中使用 class static 都可以

    mutating的作用

    在Swift中,包含三种类型(type): structure,enumeration,class。
    其中structure和enumeration是值类型(value type),class是引用类型(reference type)。值类型在初始化时,都赋值有默认值,在实例方法中并不能修改。然而使用mutating关键字修饰的实例方法,可以在方法内改变值类型的变量,并返回到原始结构中去。

    自定义下标获取值
    class IndexDemo: NSObject {
          
    }
    
    extension IndexDemo {
          subscript(index: Int) -> Int {
          get {
              // 返回一个适当的 Int 类型的值
              return number
          }
          set(newValue) {
              // 执行适当的赋值操作
          }
      }
    }
    

    相关文章

      网友评论

          本文标题:Swift记录

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