zoukankan      html  css  js  c++  java
  • Swift之枚举类型&结构体

    枚举类型

    枚举类型的介绍

    概念介绍

    • 枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。
    • 在 C/OC 语言中枚举指定相关名称为一组整型值
    • Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值.也可以提供一个值是字符串,一个字符,或是一个整型值或浮点值

    枚举类型的语法

    • 使用enum关键词并且把它们的整个定义放在一对大括号内
    enum SomeEnumeration  {
         // enumeration definition goes here
    }
    

    枚举类型的定义

    • 以下是指南针四个方向的一个例子
    • case关键词表明新的一行成员值将被定义
    • 不像 C 和 Objective-C 一样,Swift 的枚举成员在被创建时不会被赋予一个默认的整数值
    • 在上面的CompassPoints例子中,North,South,East和West不是隐式的等于0,1,2和3
    enum CompassPoint {
      case North
      case South
      case East
      case West
    }
    
    • 定义方式二:多个成员值可以出现在同一行上
    enum Planet {
      case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
    }
    

    给枚举类型赋值

    • 枚举类型赋值可以是字符串/字符/整型/浮点型

    • 注意如果有给枚举类型赋值,则必须在枚举类型后面明确说明具体的类型

    • 1.枚举类型的赋值

    // 1.枚举类型的赋值
    enum CompassPoint : Int {
      case North = 1
      case South = 2
      case East = 3
      case West = 4
    }
    enum Planet {
      case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
    }
    
    • 2.枚举类型的使用
    // 2.枚举类型的使用
    let p = Planet(rawValue: 3)
    if let p = p {
        switch p {
        case .Mercury:
            print("Mercury")
        case .Venus:
            print("Venus")
        case .Earth:
            print("Mercury")
        case .Mars:
            print("Mars")
        case .Jupiter:
            print("Jupiter")
        case .Saturn:
            print("Saturn")
        case .Uranus:
            print("Uranus")
        case .Neptune:
            print("Neptune")
        }
    }
    

    结构体

    结构体的介绍

    概念介绍

    • 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合
    • 结构体(struct)指的是一种数据结构
    • 结构体是值类型,在方法中传递时是值传递
    • 结构的定义格式

    结构的定义格式

    struct 结构体名称 {
        // 属性和方法
    }
    

    为什么需要结构体?

    先来看一个例子

    • 我们要计算平面坐标里某个点距点Center的距离是否小于200
    • 算起来很简单,勾股定理就搞定了:

    • 其中sqrt(n)用来计算n的平方根
    • pow(x, n)用来计算x的n次方
    let centerX : Double = 100
    let centerY : Double = 100
    
    func inRange(x : Double, y : Double) -> Bool {
        let disX = x - centerX
        let disY = y - centerX
    
        let dis = sqrt(pow(disX, 2) + pow(disY, 2))
    
        return dis < 200
    }
    
    let x : Double = 100
    let y : Double = 1000
    
    inRange(x, y: y)
    

    问题

    • 但是这样有一个不足,当我们需要比较很多个点和Center的距离的时候,这些数字并不能明确告诉我们它们代表的位置的意义,甚至我们都无法知道它们代表一个数字。
    • 如果我们可以像这样来比较位置:
    • 相比数字,它们看上去就会直观的多
    • 而这,就是我们需要自定义struct类型最直接的原因
    inRange(location1)
    inRange(myHome)
    
    • 使用结构进行改进
    // 初始化结构体
    struct Location {
        var x : Double
        var y : Double
    }
    // 创建结构体
    let location = Location(x: 90, y: 90)
    // 优化刚才的方法
    func inRange(location : Location) -> Bool {
        let disX = location.x - centerX
        let disY = location.y - centerY
        let dis = sqrt(pow(disX, 2) + pow(disY, 2))
        return dis < 200
    }
    inRange(location)
    

    结构体的增强

    • 扩充构造函数
    • 默认情况下创建Location时使用Location(x: x值, y: y值)
    • 但是为了让我们在使用结构体时更加的灵活,swift还可以对构造函数进行扩充

    扩充的注意点

    • 在扩充的构造函数中必须保证成员变量是有值的
    • 扩充的构造函数会覆盖原有的构造函数
    struct Location {
        var x : Double
        var y : Double
        init(x : Double, y : Double) {
            self.x = x
            self.y = y
        }
        init(xyString : String) {
            let strs = xyString.componentsSeparatedByString(",")
            x = Double(strs.first!)!
            y = Double(strs.last!)!
        }
    }
    let location = Location(x: 100, y: 100)
    let location1 = Location(xyString: "100,100")
    
    • 为结构体扩充方法
    • 为了让结构体使用更加灵活,swift的结构体中可以扩充方法
    • 例子:为了Location结构体扩充两个方法
    • 向水平方向移动的方法
    • 向垂直方向移动的方法
    struct Location {
        var x : Double
        var y : Double
        init(x : Double, y : Double) {
            self.x = x
            self.y = y
        }
        init(xyString : String) {
            let strs = xyString.componentsSeparatedByString(",")
            x = Double(strs.first!)!
            y = Double(strs.last!)!
        }
        mutating func moveH(x : Double) {
            self.x += x
        }
        mutating func moveV(y : Double) {
            self.y += y
        }
    }
    

    注意:

    • 如果我们使用的Location不是自己定义的,但是我们仍旧希望在自己的项目里扩展Location的操作
    • Swift也能帮我们达成,这个机制,叫做extension
    extension Location {
        mutating func moveH(x : Double) {
            self.x += x
        }
    
        mutating func moveV(y : Double) {
            self.y += y
        }
    }
    
  • 相关阅读:
    Tomcat6.0 sqlServer2000 配置连接池操作
    SQL GROUP BY 实例
    Java 获取当前系统时间 格式:yyyyMMdd HH:mm:ss
    银行科技与业务融合之道
    银行IT部门科技管理流程管控工作发展之路
    银行科技管理工作优化提升之我见
    事务脚本的缺点以及领域模型的优点
    异常的分级分类与处理策略
    软件高性能的思考
    软件行业的一个发展推力就是不断提高用来构造软件的基础元素,也就是所谓的编程模型
  • 原文地址:https://www.cnblogs.com/chenjianjian/p/5457550.html
Copyright © 2011-2022 走看看