八、swift3.0枚举和结构体

来源:互联网 发布:佛山mac专柜 编辑:程序博客网 时间:2024/05/23 19:20

一、枚举

swift中枚举用于管理一组有限的值的集合

特征:

支持计算属性

支持实例方法和类实例方法来初始化

允许通过扩展来增加原枚举的功能;允许协议来制定标准功能


1、定义枚举

enum <name> {     case <case>}
定义枚举时,枚举名一般首字母大写,其它都小写

swift的枚举值不会被默认分配整数值

enum Weekday {        case Monday        case Tuesday        case Wednesday        case Thursday        case Friday        case Saturday        case Sunday    }        enum Weekday2 {        case Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday    }


2、枚举值的使用

var day : Weekday day = .Sundayday = Weekday.Monday

3、设置枚举实例的原始值

通过原始值给枚举实例指定,如Int、Double、Float、Character、String类型的值

枚举实例要么全部指定原始值,要么都不指定;如果指定部分值为Int类型时,会按照大小推导;如果指定类型为Character类型时,则不能推导,需要全部指定;如果指定部分值类型为String时,则其它默认为隐式枚举值,即枚举实例名本身。

enum Season : Character {        case Spring = "S"        case Summer = "U"        case Fall = "F"        case Winter = "W"    }


4、枚举的关联值

swift中可以给不同枚举实例成员指定数量不等、类型不同的关联值

//1、定义关联值的枚举    enum Person {        case Mercury(weight:Double, density:Double, name:String)        case Venus(Double, String)        case Saturn    }

//2、访问关联值的枚举        var p1 = Person.Mercury(weight: 0.12, density: 0.123, name: "123213")        var p2 = Person.Venus(0.234, "fgf")        var p3 = Person.Saturn                switch p2 {        case Person.Venus(let D1, let S1):            print("p2的值为\(D1), 另外的值为\(S1)")        default:            break        }

5、递归枚举
即枚举的关联值类型为该枚举本身,该枚举实例必须用indirect关键字修饰

indirect enum Weekday {        case Monday(next: Weekday)        case Tuesday        case Wednesday        case Thursday        case Friday        case Saturday        case Sunday    }


二、结构体

swift的结构体和类非常相似,结构体是值类型,而类是引用类型。

当创建结构体时,如果实例存储属性显式指定了初始值,或者定义为可选类型,且没有提供任何任何构造器时,系统会默认创建一个有参和无参构造器方法;否则,系统只为其提供一个初始化有参的构造方法。

在定义结构体时可以使用如下修饰符:

访问权限修饰符:private | internal | public类型成员修饰符:class | static
[修饰符] struct name {        构造器方法        属性        方法        下标    }

1、结构体的基本使用

class ZMView: UIView {    internal struct Dog {                var name : String!        var age : Int!                func run() {            print("\(name)跑得很快!")        }    }        //使用系统默认创建的有参构造器    var dog = Dog(name: "阿黄", age: 2)        //使用无参构造器    var dg = Dog()        func demo() {                print(dog.name)            }}

注:当我们定义一个let声明的结构体常量时,那么该不可变结构体实例的属性是无法修改的,如下代码修改其值是错误的:

struct Person {        var name : String        var age : Int    }        let p = Person(name: "zhangsan", age: 18)    p.age = 20

2、定义结构体中的属性

internal struct Dog {                var name : String!        var age : Int!                func run() {            print("\(name)跑得很快!")        }    }        //使用系统默认创建的有参构造器    var dog = Dog(name: "阿黄", age: 2)            //2、定义结构体中的属性    struct Person {                //存储属性        var name : String        var age : Int                //懒加载属性        lazy var dg = Dog(name: "ahuang", age: 2)                //计算属性        var weight : Int {            get {                print("可以在这里里面做些相关的限制")                return 22            }                        set (newWeight) {                print("可以做相关的逻辑控制")                self.weight = newWeight + 20            }        }            }

3、改变结构体属性的值

swift中结构体和枚举的实例方法是无法改变其存储属性的,需要在该实例方法前面加上mutating关键字才可以修改。

struct Fseasons {        var x : String                mutating func sumStr(x1: String, y1: String) {            self.x = x1 + y1        }    }        var sea = Fseasons(x: "hha")        sea.sumStr(x1: "123", y1: "456")        print("----\(sea.x)-----")

4、结构体的下标
swift中枚举、结构体、类都支持定义下标,利用下标来简化访问对象的简化方式。
用subscript关键字定义下标;
同一个类型可以定义多个下标,通过下标的形参列表活返回值类型来区分不同的下标;
同一类型中定义多个不同的下标,称为下标的重载;
下标和计算属性非常相似,下标的定义如下:

subScript(形参列表) -> 下标返回值类型 {    get {        //下标返回值    }    set {        //通过形参获取返回值    }}

4.1、定义一个结构体的下标

struct Fseasons {        var x : String        var a : Int        var b : Int                //定义一个下标        subscript(index : Int) ->  Int {            get {                switch index {                case 0:                    return self.a                default:                    return self.b                }            }                        set {                switch index {                case 0:                    self.a = newValue                default:                    self.b = newValue                }            }                    }    }

4.2、利用下标访问结构体的属性

var rect = Fseasons(x: "123", a: 0, b: 2)                //通过下标对rect里面的属性赋值        rect[0] = 100        rect[100] = 0                //通过下标访问属性        print("a的值为:\(rect[0]), b的值为:\(rect[2])")


 
原创粉丝点击