当前位置: 首页 > news >正文

swift学习笔记《4》

1.swift Protocol

  • 设置可选协议方法

    • 需要遵守NSObjectProtocol 协议

    • 协议需要是 @objec

    • 方法是需要@object optional

      @objc protocol CircleDelegate:NSObjectProtocol {
          @objc optional func cirelcPrint()
      }
      复制代码

    • 定义delegate 属性 weak var delegate:CircleDelegate?

    • 调用代理方法 delegate?.cirelcPrint?()

  • protocol mutating 关键字

    • 使用mutation 关键字来标记一个会修改结构体的刚发

    • class 中不需要使用mutating标记,因为类总方法通常可以修改类属性

    • 可以给系统方法增加写extion,遵守代理

2.switchCase

  • case let x where x.hasSuffix("peper"): print("li it a spicy")

  • 可以在case中使用where 进行判断

3.元组

  • 取元组可以根据属性,也可以根据下标取

    let amutule : (min:Int,max:Int,sum:Int) = (2,4,6)
    print(amutule.sum)
    print(amutule.2)
    复制代码

4.函数的不确定参数个数

  • 传入一个不确定参数类别,计算和

    func sumOfnumbers(numbers:Int...)->Int{
        var sum = 0
        for numbe in numbers {
            sum += numbe
        }
        return sum
    }
    print("\(sumOfnumbers(numbers: 2,3,4,5,5))")
    复制代码

5.函数作为一个参数,传入另一个函数中

  • 一个函数传入一个参数,一个判断条件的函数参数,返回值是bool

  • 在函数内部,传参数1,调用函数参数判断

6.函数作为返回值

  • 函数作为返回值

  • 适用的时候,生产函数类型的变量,调用变量(函数)方法

7.集合map的使用

  • 使用map 批量操作集合内的元素

  • 匹配符合集合的元素批量处理,也可以进行判断,不符合条件的为0

  • 如果一个闭包的类型已知,并且作为回调函数,可以忽略参数类型和返回值,单个闭包语句,会把它语句的值当作返回值返回

  • 可以通过参数所在的位置,替代参数名来引用参数,在非常短的闭包中非常有用

8.setter 和getter 方法

  • 在setter 中新值是newValue

  • 可以在set 后面显示设置一个别名

9.监测API 可用性

  • 监测API 可用性 iOS 10
    func textAPI(){
        if #available(iOS 10, macOS 10.12,*) {
        // 在iOS 10使用,MacOS 10。12使用
        }else{
            // 使用先前的iOS,macOS的API
        }
    }
    复制代码

10.swift 数组

  • 数组的CRUD

    var aArray  = Array(repeating: 0.4, count: 3);
    
    //aArray.isEmpty
    
    //aArray.append(<#T##newElement: Double##Double#>)
    
    //aArray.insert(<#T##newElement: Double##Double#>, at: <#T##Int#>)
    
    //aArray.remove(at: <#T##Int#>)
    
    //aArray.removeLast()
    
    for (indx,value) in aArray.enumerated() {
    print("\(indx)----\(value)")
    }
    复制代码

11.swift字符串

  • 字符串的CRUD

    func textString(){
        var astring = "Guten Tag!"
        if astring.isEmpty {
            // 空字符串
        }
        print("\(astring[astring.startIndex])") // G
    
        print("\(astring[astring.index(before: astring.endIndex)])")   // !
    
        print("\(astring[astring.index(after: astring.startIndex)])") // u
    
        // let aindex = astring.index(astring.startIndex, offsetBy: 7);
    
        // print("\(astring[aindex])")  // a
    
        astring.insert("!", at: astring.endIndex)
    
        astring.insert(contentsOf: "there".characters, at: astring.index(before: astring.endIndex))
    
        //  前缀 - 后缀
    
        _ = astring.hasPrefix("acutnr")
    
        _ = astring.hasSuffix("!")
    }
    复制代码

12.范型

  • 实用方法:

    • 在尖括号里面写一个名族创建一个范型函数或者类型

    • 定一个函数,传入一个未知类型参数,重复N词,返回数组,数组红元素类型就是传入的类型

  • 使用范型- 重新实现可选类型

    • 定义可选类型的枚举

    • 使用赋值

  • 实现方法,限定参数遵守协议,类型是相同的

    • 比较两个数组中相同的元素,有返回true,没有返回false

    • 可以计算 两个集合中相同的元素返回

    • 在类型名之后使用where 制定类型的需求

    • 比如,限定类型实现某一个协议,限定两个类型是相同的,或者限定某个类必须有一个特定的父类”

    • where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element

    func anyCommonElements<T:Sequence,U:Sequence>(_ lhs :T,_ rhs: U)->Bool  where T.Iterator.Element:Equatable,T.Iterator.Element == U.Iterator.Element{
        for lhsElement in lhs {
            for rhsElement in rhs {
                if lhsElement == rhsElement {
                    return true
                }
            }
        }
        return false
    }
    复制代码

13.集合操作

  • a.intersection(b) A和B集合的交集 (A&B)

  • a.symmtriDifference(b) A +B - (A&B)

  • a.union(b) A+B

  • a.subtracting(b) A-(A&B)

14.递归枚举

  • 在枚举成员前面,加上 indirect 关键字,是可以递归的

    enum ArithmeticExpression {
        case number(Int)
        indirect  case addition(ArithmeticExpression,ArithmeticExpression)
        indirect case multiplication(ArithmeticExpression,ArithmeticExpression)   
    }
    复制代码

  • 调用枚举

    let five = ArithmeticExpression.number(5)
    let foure = ArithmeticExpression.number(4)
    let sum = ArithmeticExpression.addition(five, foure)
    let procuct = ArithmeticExpression.multiplication(sum, .number(2))
    复制代码
  • 操作能可以递归的枚举,需要可以递归的函数,

  • 如果是纯数字,直接返回该值,如果是加法,或者乘法,计算左右的算法的值,然后相加,乘

    func evaluate(_ expression:ArithmeticExpression) -> Int{
        switch expression {
            case let  .number(value):
                return value
            case let .addition(left, right):
                return  evaluate(left) + evaluate(right)
            case let .multiplication(left, right):
                return  evaluate(left) * evaluate(right)
        }
    }
    
    复制代码

15.Swift 下标 subscript

  • 写法:

  • 定义下标使用subscript关键字,指定一个或多个输入参数和返回类型

  • 与实例方法不同的是,下标可以设定为读写或只读

    subscript (index:Int)->Int{
        get{
            //返回一个适当的int 类型的操作
            return 0
        }
    
        set(newValue){
            // 执行适当的赋值操作
        }
    
    }
    复制代码
  • 下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型。下标可以使用变量参数和可变参数,但不能使用输入输出参数,也不能给参数设置默认值

  • 定义了一个Matrix结构体,用于表示一个Double类型的二维矩阵

    struct Matrix {
        let rows: Int, columns: Int
        var grid: [Double]
        init(rows: Int, columns: Int) {
            self.rows = rows
            self.columns = columns
            grid = Array(repeating: 0.0,count: rows * columns)
        }
        func indexIsValidForRow(row: Int, column: Int) -> Bool {
            return row >= 0 && row < rows && column >= 0 && column < columns
        }
        
        //  N 行 * N 列的矩阵
        subscript(row: Int, column: Int) -> Double {
            get {
                assert(indexIsValidForRow(row: row, column: column), "Index out of range")
                return grid[(row * columns) + column]
            }
            set {
                assert(indexIsValidForRow(row: row, column: column), "Index out of range")
                grid[(row * columns) + column] = newValue
            }
        }
    }
    复制代码
  • 使用

16.swift析构过程

  • 析构器用deinit 表示 -- 构造器init
  • deinit {}

17.swift访问控制

  • 模块和源文件

    • 使用import 导入另外一个模块
  • 访问级别 五种不同的访问级别

    • 开放访问/公开访问 -----同一模块下的任意文件,任意方法,任意实体

    • 内部访问 ----在模块内访问任何实体,到那时不能从外部导入模块访问

    • 文件私有访问 只能在定义的文件内部访问

    • 私有访问限制 只能在定义的作用域内访问

  • 开放访问权限最高,私有访问最低访问级别

  • 开放访问只作用于类类型和类的成员,和公开访问区别如下

  • 开放访问的类,可以在模块内,模块外继承,公开访问和更严的访问级别的类,只能在他们定义的模块内部被继承

  • 开放访问的类成员,可以在模块内,模块外的子类重写,公开访问只能在定义的模版内部重写。

  • 默认访问级别 interal 级别

  • 单目标程序,是为整个程序服务的,默认interal 即可。

  • 访问控制语法

    • 通过 open,public,internal,filepart,private , 修饰符,声明实体的访问级别:

  • 子类的访问级别不得高于父类的访问级别

  • 函数的访问级别

18.Pch 文件创建

  • 工程 - >TARGETS -> Bulid Settings ->搜索prefix -> LLVM -Language 下的Precompile Prefix Header 设置置为YES,默认是NO。
  • LLVM -Language 设置下,Prefix Header pch文件路径

转载于:https://juejin.im/post/5b8f9cc6f265da0aa74f014a

相关文章:

  • myeclipse中如何查看jdk的类文件
  • WPF 控件库——带有惯性的ScrollViewer
  • 利用 docker 配置 pinbot-crawl 环境
  • Express简介
  • Spring源码剖析依赖注入实现
  • Linux中关机命令详解
  • 迷茫的时候就看看这100句,希望对你有所启发
  • 洛谷 P1855 榨取kkksc03 (二维费用背包)
  • 我的前端工具集(一)日期时间转换工具
  • Html5之Web存储
  • linux用户与权限
  • Java I/O
  • python大佬养成计划----difflib模块
  • 都别说工资低了,我们来一起写简单的dom选择器吧!
  • grandstack graphql 工具基本试用
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • ES6 ...操作符
  • Fastjson的基本使用方法大全
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • js中forEach回调同异步问题
  • node 版本过低
  • Python学习之路16-使用API
  • SpringCloud集成分布式事务LCN (一)
  • SwizzleMethod 黑魔法
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 使用docker-compose进行多节点部署
  • 使用SAX解析XML
  • 一份游戏开发学习路线
  • 最简单的无缝轮播
  • 《码出高效》学习笔记与书中错误记录
  • 带你开发类似Pokemon Go的AR游戏
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (编译到47%失败)to be deleted
  • (七)c52学习之旅-中断
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三十五)大数据实战——Superset可视化平台搭建
  • **PHP分步表单提交思路(分页表单提交)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET 设计模式初探
  • .net 微服务 服务保护 自动重试 Polly
  • .NET关于 跳过SSL中遇到的问题
  • .NET连接MongoDB数据库实例教程
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)