八、swift3.0枚举和结构体
2017-10-08 21:54
381 查看
一、枚举
swift中枚举用于管理一组有限的值的集合
特征:
支持计算属性
支持实例方法和类实例方法来初始化
允许通过扩展来增加原枚举的功能;允许协议来制定标准功能
1、定义枚举
swift的枚举值不会被默认分配整数值
2、枚举值的使用
3、设置枚举实例的原始值
通过原始值给枚举实例指定,如Int、Double、Float、Character、String类型的值
枚举实例要么全部指定原始值,要么都不指定;如果指定部分值为Int类型时,会按照大小推导;如果指定类型为Character类型时,则不能推导,需要全部指定;如果指定部分值类型为String时,则其它默认为隐式枚举值,即枚举实例名本身。
4、枚举的关联值
swift中可以给不同枚举实例成员指定数量不等、类型不同的关联值
5、递归枚举
即枚举的关联值类型为该枚举本身,该枚举实例必须用indirect关键字修饰
二、结构体
swift的结构体和类非常相似,结构体是值类型,而类是引用类型。
当创建结构体时,如果实例存储属性显式指定了初始值,或者定义为可选类型,且没有提供任何任何构造器时,系统会默认创建一个有参和无参构造器方法;否则,系统只为其提供一个初始化有参的构造方法。
在定义结构体时可以使用如下修饰符:
1、结构体的基本使用
注:当我们定义一个let声明的结构体常量时,那么该不可变结构体实例的属性是无法修改的,如下代码修改其值是错误的:
2、定义结构体中的属性
3、改变结构体属性的值
swift中结构体和枚举的实例方法是无法改变其存储属性的,需要在该实例方法前面加上mutating关键字才可以修改。
4、结构体的下标
swift中枚举、结构体、类都支持定义下标,利用下标来简化访问对象的简化方式。
用subscript关键字定义下标;
同一个类型可以定义多个下标,通过下标的形参列表活返回值类型来区分不同的下标;
同一类型中定义多个不同的下标,称为下标的重载;
下标和计算属性非常相似,下标的定义如下:
4.1、定义一个结构体的下标
4.2、利用下标访问结构体的属性
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 = .Sunday day = 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])")
相关文章推荐
- Swift3.0-枚举(enum)和结构体(struct)
- Swift之枚举类型&结构体
- OC转Swift之基础篇(五)--枚举、结构体&泛型
- Swift_学习笔记_枚举和结构体
- Swift语言学习4--枚举和结构体
- Swift3.0中文教程: 8.枚举
- swift 笔记 (十一) —— 方法(类,结构体,枚举)
- Swift - 复杂数据类型说明(数组,字典,结构体,枚举)
- Swift基础语法(五)枚举、结构体与类的区别
- swift的枚举、结构体、协议和延展
- Swift3.0中文教程: 9.类和结构体
- swift 笔记 (十) —— 属性 (类,结构体,枚举)
- Swift - 复杂数据类型说明(数组,字典,结构体,枚举)
- swift入门 枚举和结构体
- Swift语法基础:5 - Swift的枚举和结构体
- Swift详解之六----------------枚举、结构体、类
- Swift_方法func(在类、枚举、结构体中的声明和使用 mutating func初始化值可变)
- Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别
- swift学习笔记之---数组、字典、枚举、结构体
- [Swift]枚举、类与结构体的对比