zoukankan      html  css  js  c++  java
  • swift学习笔记之-枚举

    //枚举定义

    import UIKit

    //枚举定义 (枚举、结构体、类的名字首字母必须大写,表示为定义了新的类型)

    /*枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。枚举成员可以指定任意类型的关联值存储到枚举成员中

    枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的附加信息,实例方法(instance methods),用于提供和枚举值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始值;可以在原始实现的基础上扩展它们的功能;还可以遵守协议(protocols)来提供标准的功能

    递归(indirect)枚举:递归枚举(recursive enumeration)是一种枚举类型(嵌套),它有一个或多个枚举成员使用该枚举类型的实例作为关联值。使用递归枚举时,编译器会插入一个间接层。你可以在枚举成员前加上indirect来表示该成员可递归

    */

    enum Barcode {

        case UPCA(Int, Int, Int, Int)

        case QRCode(String)

    }

    //定义一个名为Barcode的枚举类型,它的一个成员值是具有(Int,Int,Int,Int)类型关联值的UPCA,另一个成员值是具有String类型关联值的QRCode。”

    //这个定义不提供任何Int或String类型的关联值,它只是定义了,当Barcode常量和变量等于Barcode.UPCA或Barcode.QRCode时,可以存储的关联值的类型。

    enum Planet{

        case qiuti(String,String,String)

        case canshu([Int],String)

    }

    let wt1 = Planet.qiuti("diqiu", "yueqiu", "taiyang")

    let wt2 = Planet.canshu([1,2,3,4], "数据")

    switch wt2{

    case .qiuti(let a,let b,let c):      //将值绑定给常量或变量

        print("(a)、(b)、(c)")

    case let .canshu(array,str):         //声明关键字let、var可前置

        print("(array)、(str)")

    }

    //=====================================================

    enum Name:Int{

        case menber1 = 1,menber2,menber3    //原始值的隐式赋值

        case menber4,menber5

    }

    //枚举成员原始值:rawValue,若为Int枚举其成员默认rawValue为0,1,2...,若为String则为成员名字

    var meijushili = Name.menber1

    meijushili = .menber5

    var c = meijushili.rawValue

    print(c)  //c = 5

    var m = Name(rawValue: 2) //m = Name.menber2,返回的是可选的枚举类型,原始值构造器是一个可失败构造器

    print(m)

    //======================================================

    //枚举类型应用:计算表达式的值,如: (3+5)*(11-9)

    indirect enum Jisuan {        //外置indirect 关键字表示该枚举的所有成员均可递归(嵌套),内置则指定某成员可递归

        case number(Int)

        case jiafa(Jisuan,Jisuan)

        case jianfa(Jisuan,Jisuan)

        case chengfa(Jisuan,Jisuan)

        case chufa(Jisuan,Jisuan)

    }

    func kaishi(suanfa:Jisuan)->Int{

        switch suanfa{

        case .number(let a):

            return a

        case .jiafa(let left, let right):

            return kaishi(left) + kaishi(right)

        case .jianfa(let left, let right):

            return kaishi(left) - kaishi(right)

        case .chengfa(let left, let right):

            return kaishi(left) * kaishi(right)

        case .chufa(let left, let right):

            return kaishi(left) / kaishi(right)

        }

    }

    //var a = Jisuan.number(15)

    var sumjiafa = Jisuan.jiafa(.number(3), .number(5))  //3+5

    var sumjianfa = Jisuan.jianfa(.number(11), .number(9))  //11-9

    var sumchengfa = Jisuan.chengfa(sumjiafa, sumjianfa)   //(3+5)*(11-9) = 16

    var sumchufa = Jisuan.chufa(sumchengfa, sumjiafa)  //(3+5)*(11-9)/(3+5) = 2

    var sum1 = kaishi(sumchengfa)

    var sum2 = kaishi(sumchufa)

    print(sum1)

    print(sum2)

    读完觉得学到点什么,就( 顶一个!)
  • 相关阅读:
    HDUOJ 1397(素数筛选法)
    HDUOJ 2045 LELE的RPG难题
    HDUOJ 2018
    HDUOJ 2031
    HDUOJ 2050
    括号配对问题
    HDOJ 1102 Constructing Roads(最小生成树)
    HDOJ Prime Ring Problem (深度优先搜索)
    HDUOJ 1233 还是畅通工程(最小生成树基础)
    邻接表(转)
  • 原文地址:https://www.cnblogs.com/susufufu/p/5705590.html
Copyright © 2011-2022 走看看