枚举、结构体、类

注:本文为作者自己总结。过于基础的就不再赘述 ,都是亲自測试的结果。如有错误或者遗漏的地方。欢迎指正,一起学习。


1、枚举

枚举是用来定义一组通用类型的一组相关值 ,关键字enum ,case关键词表明新的一行成员值将被定义。

enum Direction{
case East
case West
case South
case North
}

这里定义了一个简单的枚举类型 , 里面有四个枚举元素 。

也能够用一行的形式

enum Direction{
case East , West , South , North
}

能够这样来訪问这个枚举类型var dir = Direction.East 。这时候这个变量 dir 已经被判断成Direction ,又一次赋值的时候 能够直接用短语法dir = .West

  • 相关值(Associated Values)

    你能够定义 Swift 的枚举存储不论什么类型的相关值,假设须要的话,每一个成员的数据类型能够是各不同样的。
enum Barcode {
case UPCA(Int , Int , Int ,Int )
case QRCode(String)
}

你能够这样给它赋值var pro = Barcode.UPCA(8, 53627, 29009, 1) 。也能够这样改动pro = .QRCode("DSLEKWLJELJAIWFLWKJF")

这样取值

switch pro{
case .UPCA(let a1,let a2, let a3, let a4):
print("\(a1) , \(a2) , \(a3) , \(a4)")
case .QRCode(let s):
print(s)
}

你也能够把let写在最前面

switch pro{
case let .UPCA( a1, a2, a3, a4):
print("\(a1) , \(a2) , \(a3) , \(a4)")
case let .QRCode(s):
print(s)
}

两个得到同样的结果 : DSLEKWLJELJAIWFLWKJF

  • 给枚举指定特定类型 (原始值)

    你能够给一个枚举指定类型 。比方说String 类型 。
enum  SignBuilding : String{
case Beijing = "天安门"
case XiAn = "兵马俑"
}

这里将 这个枚举定义成 字符串类型的 。

通过这样能够取到相应的值print(SignBuilding.Beijing.rawValue)

也能够原始值隐式赋值

enum IntVal:Int {
case Val1 = 1 , Val2 , Val3
}

假设没给Val1赋值 。默认是 0 。递增是 1 ,也能够 自己制定初始值 (这里我们给定了初始值1)

也能够使用原始值来初始化枚举 let val = IntVal(rawValue: 2) print(val) //Optional(IntVal.Val2) ,这里得到的结果是Optional类型 ,由于不是全部的数字都能匹配到相应的枚举类型 。如 :let errorVal = IntVal(rawValue: 5) print(errorVal) //nil

官方还给出了递归枚举 ,关键字 indirect 。可是我这边尝试了好多次 ,这个关键字也没有变色 ,还会报错 。

enum Calculate{
case Num(Int)
indirect case Plus(Calculate,Calculate)
indirect case ChenFa(Calculate,Calculate)
}

在网上搜了下 , 由于是2.0的新特性 。网上也没有太多的解释。大家能够研究下 。我也研究下 ,研究出来再来补上。

枚举里面还能够有方法 ,只是不太推荐把 。全然能够用结构体和方法 。

枚举和结构体都是值类型 。在传递的时候都是以拷贝的方式。

类是引用类型 ,传递的时候仅仅是传递一个引用 。

2、类和结构体

Class 结构体 struct 简单的定义

struct myPoint
{
var x = 0;
var y = 0;
} class Person {
var name:String? ;
var age:Int?;
var p1 = myPoint(x: 1,y: 2);
var p = myPoint();
}

这里定义了一个简单的结构体和类,类中定义了几个简单的属性 , 包含 一个结构体属性 ,给出了两种初始化的方法 。关于属性的声明能够去看 Swift具体解释之中的一个 ——– 变量声明

Int , float 。 数组 字典 等 都是值类型 后台都以结构体的方式实现

一般使用结构体的情况

  1. 结构体的主要目的是用来封装少量 简单的数据值
  2. 估计实例在赋值或传递过程中将会被拷贝 而不是引用
  3. 不论什么在结构体中存储的值类型属性也将被拷贝 而不是引用
  4. 不须要继承已存在的类型 或者属性 行为(结构体是没有继承的)

假设创建了一个结构体的实例。而且将这个实例赋值给一个常量 则无法改动其属性 。就算是变量属性也无法改动

let p1 = myPoint(x: 1,y: 1)



这里我尝试改动结构体中的变量x 报错 。

引用类型赋给常量,仍然能够改变其变量属性。所以类的实例能够赋值给一个常量

  • 懒载入

延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。

在属性声明前使用lazy来标示一个延迟存储属性。 (懒载入)

注意:必须将延迟存储属性声明成变量(使用var关键字),由于属性的值在实例构造完毕之前可能无法得到。而常量属性在构造过程完毕之前必须要有初始值,因此无法声明成延迟属性。

看下官方给的样例。

class DataImporter {
/*
DataImporter 是一个将外部文件里的数据导入的类。
这个类的初始化会消耗不少时间。
*/
var fileName = "data.txt"
// 这是提供数据导入功能
}
class DataManager {
lazy var importer = DataImporter() //这里使用了懒载入 在第一次用到的时候才去创建这个实例 假设创建DataManager 就去创建DataImporter 有可能并不须要这个实例。浪费内存和时间
var data = [String]()
// 这是提供数据管理功能
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// DataImporter 实例的 importer 属性还没有被创建

这里能够看到我们并没有使用DataImporter , 所以在创建DataManager()的时候并不并不须要初始化DataImporter ,所以我们使用懒载入在这时候就节省了内存的开支。

可是。假设被标记位lazy的属性 在没有被初始化的时候被多个线程訪问 这时候 不能保证这个属性仅仅被实例一次

我们能够通过以下的方式定义一个仅仅读属性 。

var a = 1.2;
var b:Double{
return a*4
}
  • 类型属性

    无论这个类有多少个实例 ,它的类属性 仅仅有一个 。

    关键字 static
struct myStruct
{
static var height = 19.3
}

能够直接通过结构体的名字或者类的名字来调用类型 属性print(myStruct.height)

只是在类中有时候须要使用关键字class ,来同意它的子类重写这个属性 。

class myClass {
static let name = "zhangsan "
static var age = 21
static var status: Int { return 1 }
//在定义计算型属性的时候能够使用 关键字 class 来支持子类对父类进行重写
class var canOverrid: Int { return 10 }
}
class sonClass: myClass {
override static var canOverrid: Int { return 89 }
//static let name = "zhangsan " //cannot override with a stored property 'name'
}

这里我们子类能够重写class 标记的类型属性 。

  • 方法

    方法能够分成实例方法和类型方法 。

    类、结构体、枚举都能够定义实例方法;实例方法为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也能够定义类型方法;类型方法与类型本身相关联。

结构体和枚举能够定义方法 是swift和oc的一大差别

类型方法就是在func 前面加static 类有时候可能须要加class 。

跟属性的使用方法是一样的,这里就不在实例 。

  • 变异方法

值类型的属性不能在实例方法中被改动。可是有时候你确实想改动过。这时候 你能够使用变异方法 。

关键字 mutating

struct Counter{
var count = 0
func getCount() ->Int{
return count
}
//由于值类型的属性不能在实例方法中被改动 这里使用了变异方法
mutating func increment()
{
count++
}
}
var c = Counter()
print(c.count) // 0
print(c.getCount()) // 0
c.increment()
print(c.count) // 1

变异方法能够给自己赋值

enum Level {
case High , Mid ,Low mutating func next() {
switch self
{
case .High:
self = Mid
case .Mid:
self = Low
default:
self = High
}
} } var level = Level.High
level.next()
print(level) //Level.Mid
level.next()
print(level) //Level.Low

学习iOS。有他就够了,小码哥视频,传智、黑马、各种swift书籍

Swift具体解释之六----------------枚举、结构体、类的更多相关文章

  1. 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  2. Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  3. 枚举类 enum,结构体类 struct

    1.枚举类型的值,直观易于理解,见词知意. 格式: enum 枚举类名:值类型 { 值1, 值2, 值n } 每个值默认(省略“:值类型”)以int型数据存储,从0开始. 使用格式:枚举类名 变量=枚 ...

  4. C#学习笔记_12_枚举&结构体

    12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch c ...

  5. Swift 数组,字典,结构体,枚举

    1.数组 let types = ["none","warning","error"]//省略类型的数组声明 var menbers = [ ...

  6. Swift建立栈的泛型结构体以及top()、push()、pop()定义函数的定义

    首先可以使用swift定义Stack的结构体 //泛型表达 struct Stack<T> { var items = <T>() //定义栈顶函数,返回栈顶元素 mutati ...

  7. [C]语法, 知识点总结(二. 结构体, 类别名, static, const)

    结构体 定义: struct Student{ // 定义结构体Student, stu是创建的对象         char a[17]; // 结构体里面可以有多种不同类型的变量         ...

  8. [转]C++结构体|类 内存对齐详解

    内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 . 为什么需要内存对齐?对 ...

  9. C语言学习笔记--枚举&结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

随机推荐

  1. 232 Implement Queue using Stacks 用栈来实现队列

    使用栈来实现队列的如下操作: push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移除元素.peek() -- 返回队列首部的元素.empty() -- 返回队列是否为空.注意 ...

  2. 6.13---example

    example如何使用?简单查询这个例子展示了如何用生成后的Example类去生成一个简单的where子句: TestTableExample example = new TestTableExamp ...

  3. LN : leetcode 515 Find Largest Value in Each Tree Row

    lc 515 Find Largest Value in Each Tree Row 515 Find Largest Value in Each Tree Row You need to find ...

  4. python自动化--语言基础三字典、函数、全局/局部变量

    字典 dict1 = {,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values()) #打印所有的values值 pri ...

  5. sp_Msforeachtable与sp_Msforeachdb详解

      一.简要介绍: 系统存储过程sp_MSforeachtable和sp_MSforeachdb,是微软提供的两个不公开的存储过程.从mssql6.5开始,存放在SQL Server的MASTER数据 ...

  6. 4星|《DK商业百科》:主要商业思想与事件的概括

    全书分为以下6章:1:企业的起步与发展:2:领导和人力资源:3:理财:4:战略和运营:5:营销管理:6:生产与生产后.每章有拆分为成多个比较小的专题,阐述相关专题的主要的商业思想与实践. 基本是作者按 ...

  7. python3 操作excel表

    python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库可从这里下载https://pypi.python.org/pypi.下面分别记录py ...

  8. wpf 自定义Button按钮

    创建ButtonEx类 public class ButtonEx : Button { static ButtonEx() { DefaultStyleKeyProperty.OverrideMet ...

  9. 洛谷——P1342 请柬

    P1342 请柬 题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学 ...

  10. mysql运维常用

    一.用户授权 用户授权主要指: 1.可以限制用户访问那些库.表 2.可以限制用户对库.表执行select.create.delete.alter.drop等操作 3.可以限制用户登陆的IP.IP段.或 ...