2016-07-31 08:56:30 huangyongf 阅读数 2006
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2904 人正在学习 去看看 任苹蜻

OC枚举和Swift 枚举


下面介绍一下 OC 枚举和 Swift 枚举的写法!

OC枚举:


         


Swift 枚举:

            


 以上,希望对大家会有所帮助,谢谢!










2014-06-09 20:20:18 woaifen3344 阅读数 4788
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2904 人正在学习 去看看 任苹蜻

Swift中的枚举与C、OC中的枚举有很大的区别,增加了原来类中都有的特性到枚举中。

定义枚举的语法:

enum SimeEnum {
  // enumeration goes here
}

定义一个指南针的四个方向的枚举:

// 使用case来表示新成员的定义开始
enum CompassPoint {
  case North
  case South
  case East
  case West
}

// 使用枚举

var direction = CompassPoint.West
// 再次修改时,可以不指定枚举,而可以只使用.引用

direction = .North


下面是引用   BY  · 2014年6月5日


枚举定义了一个常用的具有相关性的一组数据,并在你的代码中以一个安全的方式使用它们。
如果你熟悉C语言,你就会知道,C语言中的枚举指定相关名称为一组整数值。在Swift中枚举更为灵活,不必为枚举的每个成员提供一个值。如果一个值(被称为“原始”的值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或者任何整数或浮点类型的值。
另外,枚举成员可以指定任何类型,每个成员都可以存储的不同的相关值,就像其他语言中使用集合或变体。你还可以定义一组通用的相关成员为一个枚举,每一种都有不同的一组与它相关的适当类型的值的一部分。
在Swift中枚举类型是最重要的类型。它采用了很多以前只有类才具有的特性,如计算性能,以提供有关枚举的当前值的更多信息,方法和实例方法提供的功能相关的枚举表示的值传统上支持的许多功能。枚举也可以定义初始化,以提供一个初始成员值;可以在原有基础上扩展扩大它们的功能;并使用协议来提供标准功能。
欲了解更多有关这些功能,请参见Properties, Methods, Initialization, Extensions, Protocols

1、枚举语法

使用枚举enum关键词并把他们的整个定义在一对大括号内:

1
2
3
enum SomeEnumeration {
    // enumeration definition goes here
}

下面是一个指南针的四个点一个例子:

1
2
3
4
5
6
enum CompassPoint {
    case North
    case South
    case East
    case West
}

在枚举中定义的值(如North,South,East和West)是枚举的成员值(或成员)。这个例子里case关键字表示成员值一条新的分支将被定义。

Note
不像C和Objective-C,Swift枚举成员在创建时不分配默认整数值。在上面的例子CompassPoints中North,South,Eath,West不等于隐含0,1,2和3,而是一种与CompassPoint明确被定义的类型却各不相同的值。

多个成员的值可以出现在一行上,用逗号分隔:

1
2
3
enum Planet {
    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

每个枚举定义中定义了一个全新的类型。像其他Swift的类型,它们的名称(如CompassPoint和Planet)应为大写字母。给枚举类型单数而不是复数的名字,这样理解起来更加容易如:

1
var directionToHead = CompassPoint.West

使用directionToHead的类型时,用CompassPoint的一个可能值初始化的推断。一旦directionToHead被声明为一个CompassPoint,您可以将其设置为使用更短的.语法而不用再书写枚举CompassPoint值本身:

1
directionToHead = .East

directionToHead的类型是已知的,所以你可以在设定它的值时,不写该类型。使用类型明确的枚举值可以让代码具有更好的可读性。

2、匹配枚举值与switch语句

你可以使用单个枚举值匹配switch语句:

1
2
3
4
5
6
7
8
9
10
11
12
directionToHead = .South
switch directionToHead {
case .North:
    println("Lots of planets have a north")
case .South:
    println("Watch out for penguins")
case .East:
    println("Where the sun rises")
case .West:
    println("Where the skies are blue")
}
// prints "Watch out for penguins"

你可以理解这段代码:

“考虑directionToHead的价值。当它等于North,打印“Lots of planets have a north”。当它等于South,打印“Watch out for penguins”等等。

正如控制流所描述,Switch语句考虑枚举的成员,如果省略了West时,这段代码无法编译,因为它没有考虑CompassPoint成员的完整性。Switch语句要求全面性确保枚举成员,避免不小心漏掉情况发生。

当它不需要为每一个枚举成员都匹配的情况下,你可以提供一个默认default分支来涵盖未明确提到的任何成员:

1
2
3
4
5
6
7
8
let somePlanet = Planet.Earth
switch somePlanet {
case .Earth:
    println("Mostly harmless")
default:
    println("Not a safe place for humans")
}
// prints "Mostly harmless"

3、关联值

在上一节中的示例延时了一个枚举的成员是如何被定义(分类)的。你可以为Planet.Earth设置一个常量或变量,然后在代码中检查这个值。但是,它有时是有用的才能存储其它类型的关联值除了这些成员的值。这让你随着成员值存储额外的自定义信息,并允许在你的代码中来使用该信息。

Swift的枚举类型可以由一些数据类型相关的组成,如果需要的话,这些数据类型可以是各不相同的。枚举的这种特性跟其它语言中的奇异集合,标签集合或者变体相似

例如,假设一个库存跟踪系统需要由两种不同类型的条形码来跟踪产品。有些产品上标有UPC-A代码格式,它使用数字0到9的一维条码,每一个条码都有一个“数字系统”的数字,后跟十“标识符”的数字。最后一位是“检查”位,以验证代码已被正确扫描:

image其他产品都贴有二维条码QR码格式,它可以使用任何的ISO8859-1字符,并可以编码字符串,最多2,953个字符:

image

这将是方便的库存跟踪系统能够存储UPC-A条码作为三个整数的元组,和QR代码的条形码的任何长度的字符串。

在Swift中可以使用一个枚举来定义两种类型的产品条形码,结构可以是这样的:

1
2
3
4
enum Barcode {
    case UPCA(Int, Int, Int)
    case QRCode(String)
}

这可以被理解为:

“定义一个名为条形码枚举类型,它可以是UPC-A的任一值类型的关联值(Int,Int,Int),或QRCode的一个类型为String的关联值。”

这个定义不提供任何实际的Int或String值,它只是定义了条形码常量和变量当等于Barcode.UPCA或Barcode.QRCode关联值的类型的时候的存储形式。

然后可以使用任何一种类型来创建新的条码:

1
var productBarcode = Barcode.UPCA(8, 85909_51226, 3)

此示例创建一个名为productBarcode新的变量,并与相关联的元组值赋给它Barcode.UPCA的值(8,8590951226,3)。提供的“标识符”值都有整数加下划线的文字,85909_51226,使其更易于阅读的条形码。

同一产品可以分配不同类型的条形码:

1
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

在这一点上,原来Barcode.UPCA和其整数值被新的Barcode.QRCode及其字符串值代替。_条形码的常量和变量可以存储任何一个_UPCA或QRCode的(连同其关联值),但它们只能存储其中之一在任何指定时间。

不同的条码类型像以前一样可以使用一个switch语句来检查,但是这一次相关的值可以被提取作为switch语句的一部分。您提取每个相关值作为常数(let前缀)或变量(var前缀)不同的情况下,在switch语句的case代码内使用:

1
2
3
4
5
6
7
switch productBarcode {
case .UPCA(let numberSystem, let identifier, let check):
    println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
case .QRCode(let productCode):
    println("QR code with value of \(productCode).")
}
// prints "QR code with value of ABCDEFGHIJKLMNOP."

如果所有的枚举成员的关联值的提取为常数,或者当所有被提取为变量,为了简洁起见,可以放置一个var,或let标注在成员名称前:

1
2
3
4
5
6
7
switch productBarcode {
case let .UPCA(numberSystem, identifier, check):
    println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
case let .QRCode(productCode):
    println("QR code with value of \(productCode).")
}
// prints "QR code with value of ABCDEFGHIJKLMNOP."

4、原始值

在关联值的条形码的例子演示了一个枚举的成员如何能声明它们存储不同类型的关联值。作为替代关联值,枚举成员可以拿出预先填入缺省值(称为原始值),从而具有相同的类型。

这里是一个存储原始的ASCII值命名枚举成员的一个例子:

1
2
3
4
5
enum ASCIIControlCharacter: Character {
    case Tab = "\t"
    case LineFeed = "\n"
    case CarriageReturn = "\r"
}

在这里,原始值被定义为字符类型的枚举叫做ASCIIControlCharacter,并设置了一些比较常见的ASCII控制字符。字符值的字符串和字符的描述。

注意,原始值是不相同关联值。原始值设置为预填充的值时,应先在你的代码中定义枚举,像上述三个ASCII码。对于一个特定的枚举成员的原始值始终是相同的。当你创建一个基于枚举的常量或变量的新成员的关联值设置,每次当你这样做的时候可以是不同的。

原始值可以是字符串,字符,或任何整数或浮点数类型。每个原始值必须在它的枚举中唯一声明。当整数被用于原始值,如果其他​​枚举成员没有值时,它们自动递增。

下面列举的是一个细化的早期Planet枚举,使用原始整数值来表示每个Planet的太阳系的顺序:

1
2
3
enum Planet: Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

自动递增意味着Planet.Venus具有2的原始值,依此类推。

访问其toRaw方法枚举成员的原始值:

1
2
let earthsOrder = Planet.Earth.toRaw()
// earthsOrder is 3

使用枚举的fromRaw方法来试图找到一个特定的原始值枚举成员。这个例子识别Uranus的位置通过原始值为7:

1
2
let possiblePlanet = Planet.fromRaw(7)
// possiblePlanet is of type Planet? and equals Planet.Uranus

然而,并非所有可能的Int值都会找到一个匹配的星球。正因如此,该fromRaw方法返回一个可选的枚举成员。在上面的例子中,是possiblePlanet类型Planet?或“可选的Planet”。

如果你试图找到一个Planet为9的位置,通过fromRaw返回可选的Planet值将是无:

1
2
3
4
5
6
7
8
9
10
11
12
let positionToFind = 9
if let somePlanet = Planet.fromRaw(positionToFind) {
    switch somePlanet {
    case .Earth:
        println("Mostly harmless")
    default:
        println("Not a safe place for humans")
    }
} else {
    println("There isn't a planet at position \(positionToFind)")
}
// prints "There isn't a planet at position 9"

这个范例使用somePlanet= Planet.fromRaw(9)来尝试访问可选集合Planet,在可选Planet集合中设置检索条件somePlanet,在原始值为9的情况下,不能检索到位置为9的星球,所有else分支被执行。

 



2018-04-24 13:11:07 meiyulong518 阅读数 255
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2904 人正在学习 去看看 任苹蜻

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

enum DiGui {//定义枚举
    case number(Int)//枚举添加关联值(可以为元组)
    indirect case addition(DiGui,DiGui)
    indirect case multiplication(DiGui,DiGui)
}

 //递归 递归 该函数如果遇到纯数字,就直接返回该数字的值。如果遇到的是加法或乘法运算,则分别计算左边表达式和右边表达式的值,然后相加或相乘。

    func evaluate(_ expression: DiGui) -> 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)

        }

    }


//(5+4)*2

        let five = DiGui.number(5)

        let four = DiGui.number(4)

        let sum = DiGui.addition(five, four)

        let cheng = DiGui.multiplication(sum, DiGui.number(2))

        evaluate(cheng)//18



2019-02-25 20:35:07 wei78008023 阅读数 507
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2904 人正在学习 去看看 任苹蜻

在OC和Swift混编的过程中有很多的细节需要注意。

今天介绍一下在OC文件中声明了一个枚举类型,如何在Swift文件中调用该枚举类型的值。

1.项目工程构建的时候选的是Swift语言,项目名称TestProject。

2.建立一个Swift文件SwiftTestFile.swift 和一个OC的文件 ObjectTestFile.h 和ObjectTestFile.m。

在ObjectTestFile.h 中声明一个枚举类型:

typedef NS_ENUM(NSInteger, YXLabelStyle) {
    YXLabelStyleSingle1_1,
    YXLabelStyleSingle1_2,
    YXLabelStyleSingle1_3,
}

首先必须确认的是枚举的每个值必须是枚举的“名字+后缀”的形式,这是一种规范,不这样在Swift文件中会导致调用不到。

也就是例子中枚举名为“YXLabelStyle”,那么每个值必须是“YXLabelStyle+...”的形式。

3.首先想要Swift调用OC文件及内容,必须有一个桥接文件并把需要调用的OC文件的头文件引入,桥接文件的构建就不多说了,一搜一大把,我们项目中桥接文件为“Bridging-Header.h”。

桥接文件中导入头文件:

#ifndef Bridging_Header_h
#define Bridging_Header_h

#import "ObjectTestFile.h"

#endif /* Bridging_Header_h */

4.这样就可以在Swift文件中调用这个枚举类型的值。

在调用的时候直接使用“YXLabelStyle.single1_1”或者直接“.single1_1”调用即可,这就是为什么要规范的原因。

5.列子:

假设我们有一个YXLabel,自定义实例化方法需要传入该枚举类型的值来确定YXLabel的一些样式和特性,那么我么可以这样:

let label = YXLabel(style: YXLabelStyle.single1_1)

或者直接这样:

let label = YXLabel(style: .single4_1)

 

2016-07-31 22:55:52 chendehao001 阅读数 3827
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2904 人正在学习 去看看 任苹蜻

1. Swift枚举基本概念

  • Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型,
  • 它可以像类和结构体一样增加属性和方法

  • 格式:

enum Method{    
    case 枚举值
}
enum Method{
    case Add
    case Sub
    case Mul
    case Div
}

2. 枚举的基本使用

  • 可以枚举值可以连着写, 但是要以逗号,分隔
enum Menthod1 {
    case Add, Sub, Mul, Div
}
  • 可以使用枚举类型变量或常量接收枚举值
var m: Method = .Add
  • 注意: 如果变量或常量没有指定类型, 那么前面必须加上该值属于哪个枚举类型
// var m1 =  .Add //直接报错
var m1 = Method.Add //正确写法
  • 利用Switch匹配
    • 注意: 如果case中包含了所有的值, 可以不写default.
    • 如果case中没有包含枚举中所有的值, 必须写default
//注意: 如果case中包含了所有的值, 可以不写default.
//如果case中没有包含枚举中所有的值, 必须写default
switch (Method.Add){
case Method.Add:
    print("加法")
case Method.Sub:
    print("减法")
case Method.Mul:
    print("除法")
case Method.Div:
    print("乘法")
default:
    print("都不是")
}

3. 原始值

  • OC中枚举的本质就是整数, 所以OC中的枚举是有原始值的,默认是从0开始
  • 而Swift中的枚举默认是没有原始值的, 但是可以在定义时告诉系统让枚举有原始值
  • 和OC中的枚举一样, 也可以指定原始值, 后面的值默认+1 , 但必须指定枚举的类型, 并且一定是 Int 类型
  • Swift中的枚举除了可以指定整形以外还可以指定其它类型, 但是如果指定其它类型, 必须给所有枚举值赋值, 因为不能自动递增
// 指定了枚举原始值类型为 Int , 所以并且给第一个枚举值定义了原始值, 则后面的值默认 +1
enum Method3: Int{
    case Add = 5, Sub, Mul, Div
}
// 自定的枚举原始值的类型不是 Int , 所以后面的值不会默认 +1, 
// 后面的也需要手动赋值
enum Method4: Double{
    case Add = 5.0, Sub = 6.0, Mul = 6.1, Div = 8.0
}
  • 原始值转换为枚举值
enum Method5: String{    
    case Add = "add", Sub = "sub", Mul = "mul", Div = "div"
}
  • 获取枚举原始值
    • rawValue代表将枚举值转换为原始值, 注意老版本中转换为原始值的方法名叫toRaw
Method4.Sub.rawValue
print(Method4.Sub.rawValue)
// 输出结果: 6.0
  • 通过原始值创建枚举值
    • 原始值区分大小写
    • 返回的是一个可选值,因为原始值对应的枚举值不一定存在
    • 老版本中为fromRaw(“add”)
let m2 = Method5(rawValue: "add")
print(m2)

func chooseMethod(op:String){
    // 由于返回是可选类型, 所以有可能为nil, 最好使用可选绑定
    if let opE = Method5(rawValue: op){
        switch (opE){
        case .Add:
            print("加法")
        case .Sub:
            print("减法")
        case .Mul:
            print("除法")
        case .Div:
            print("乘法")
        }
    }
}

4. 枚举相关值

  • 可以让枚举值对应的原始值不是唯一的, 而是一个变量.
  • 每一个枚举可以是在某种模式下的一些特定值
enum lineSegmentDescriptor{
    case StartAndEndPattern(start:Double, end:Double)
    case StartAndLengthPattern(start: Double, length:Double)
}

var lsd = lineSegmentDescriptor.StartAndLengthPattern(start: 0.0, length: 100.0)
lsd = lineSegmentDescriptor.StartAndEndPattern(start: 0.0, end: 50.0)

print(lsd)
// 输出结果: StartAndEndPattern(0.0, 50.0)
  • 利用switch提取枚举关联值
switch lsd {
case let .StartAndEndPattern(s, e):
    print("start = \(s) end = \(e)")
case .StartAndLengthPattern(let s, let l):
    print("start = \(s) lenght = \(l)")
}
// 输出结果: start = 0.0 end = 50.0

Swift中的枚举

阅读数 405

没有更多推荐了,返回首页