您的位置:首页 > 移动开发 > Swift

八、swift3.0枚举和结构体

2017-10-08 21:54 381 查看
一、枚举

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])")







                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 学习 博客 swift