浅谈swift中的那些结构体和枚举

首先呢, 我们先写一个struct

struct Point {
    var x = 0
    var y = 1
    mutating func change (newX:Int,newY: Int) {
        x = newX
        y = newY
    }
}

var p1 = Point(x: 4, y: 4)

p1.x  //4
 

在这里呢,可能有人会问,为什么在func前面要加一个mutating,

如果不加的话, 编译器抛出错误,报出不能在实例方法中修改属性值

所以呢, 我们必须如果想改变成员变量的话, 就必须要在func前面加一个mutating

在这里要注意一下的就是,struct 是一个值类型

let p = Point()

p.x = 20 //报错

p = Point() //报错,let作用

枚举为一系相关联的值定义了一个公共的组类型.同时能够让你在编程的时候在类型安全的情况下去使用这些值。

你可以用enum开始并且用大括号包含整个定义体来定义一个枚举:

enum{
 case
 case
}

首先呢,我们先创建一个枚举

enum Gender {
    case Male(String)
    case Female(Int,String) //表示可以关联任意类型,每个case关联的数据可以不一样

}

我们事例化一个枚举对象

let wd = Gender.Male("男")

switch 判断一下

switch wd {
case .Male(let x):
    print("这个是\(x)")  //"这个是男"
case .Female:
    print("nv")
}

还可以事例化两个参数

let hy = Gender.Female(18, "zs")

switch一下

switch hy {
case .Male(let x):
    print("zhe shi ge \(x)")
case let .Female ( x , y): //相当于x与y都是let
    print("nv\(x,y)")  //"nv(18,zs)"
}

好了, 枚举就介绍到这里就结束了,

还有补充一下, 关于?和!的链式操作()

var i:String?="ddd"  和 var i:String!="ddd" 是Optional

?表示该值可以为ni,如果是一般的数据类型是不允许为nil,在链式操作中如果是nil的话,不报错

! 称之为隐式的解封,强制转换,在链式操作中如果是nil的话,就直接报错

下面我们来写个案例来区别两者,首先呢, 如果不赋值的话, 都是默认的是nil

var a : String?           //a 为nil
var b : String!           //b 为nil
var a_test = a            //a_test为nil
var b_test = b            //b_test为nil

我们定义两个String变量

var str: String? = "asdfasdf"
var str1: String! = "asdfasdf"
 

我们来调用字符串的方法

str.startIndex//会报错,因为此时str不是一个真正的String,所以没有startIndex
str1.startIndex //不会报错

链式操作实例

class Person {
    var ci: ClassInfo?
   }
class ClassInfo {
    var t:Teacher?
}
class Teacher {
    var name = "cj"
}
let p = Person()

let t = Teacher()
let ci = ClassInfo()
ci.t = t
p.ci = ci
p.ci?.t?.name = "double"
p.ci?.t?.name   //"double"
p.ci!.t!.name  //可以强制解封"double"

总结

    1. 问号?
      a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
      b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
    2. 叹号!
      a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
      b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理
时间: 2024-07-30 10:17:39

浅谈swift中的那些结构体和枚举的相关文章

Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别

Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始-元组(tuples). 元组(tuple) 元组是多个值组成的复合值类型,例如,你可以定义一个含有整形和字符串的tuple let amout=(100,"EUR") 当你函数需要返回多个值时,元组这个时候非常有用,你可以使用下标方式来访问元组中的值,如.0,.1以此类推,如下: let

浅谈c语言typedef 与结构体指针(个人小经验)

 #include<stdio.h> #include<string.h> typedef struct emp{ char sex[8]; char name[15]; int age; }*emp;//这里我们用typedef把emp这个结构体变成了*emp这种指向结构体成员的结构体指针 /*typedef struct emp{ char sex[8]; char name[15]; int age; }pi,*emp;//为了程序的可读性最好不要这样声明*/ int m

Swift 的类、结构体、枚举等的构造过程Initialization(上)

构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initializers)来实现的,这些构造器可以看做是用来创建特定类型实例的特殊方法.与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化. 类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行特定的清除工作.想了解更多关于

浅谈swift中的那些类,结构以及初始化的操作

首先呢,我们先声明一个类 class Parent { //声明一个属性 var p1: String = "abc" //声明一个方法 func m() { print("parent m") } //声明一个静态的方法 final func n(){ } } 然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new 一个的话, 直接调用该类就可以了) var par = Parent() 调用parent的方法和属性 par.m()

浅谈 Swift 中的泛型

Objective-C缺乏一个重要特性:不支持泛型.幸运地是,Swift拥有这一特性.泛型允许你声明的函数.类以及结构体支持不同的数据类型. 提出问题 优秀的泛型使用案例中,最常见的例子当属对栈(Stack)的操作.栈作为容器有两种操作:一.压入(Push)操作添加项到容器中;二.弹出(Pop)操作将最近添加项从容器移除.首先我们用非泛型方式设计栈.最后代码如下所示: 1234567891011121314 class IntStack{ // 采用数组作为容器保存数据 类型为Int priva

浅谈swift中的内存管理

Swift使用自动引用计数(ARC(Automatic Reference Count))来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 内存管理:针对的是实例的内存占用的管理(放在堆里面) 实例:1:由class类型构建的实例,2:闭包对象 下面我们来写一个实例来证明一下 class Person { var name: String init(name: String )

浅谈swift中的函数类型和闭包

在讲swift的函数类型之前,我们先回忆一下我们以前学的定义一个swift的函数 func add(a: Int,b: Int) -> Int { return a + b } 好了, 我们开始我们函数类型的讲解 上面这个函数的类型是(Int ,Int)->Int 使用函数类型 我们都知道, 在swift中 , 函数类型就像其他数据类型一样,也就意味着我们可以给一个函数的常量或者是变量赋值 var f2: (Int,Int)-> Int = add f2(2,3) //结果为5 好了,接

浅谈 Swift 中的 Optionals

input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.form-horizontal .form-group-sm input

Swift 的类、结构体、枚举等的构造过程Initialization(下)

类的继承和构造过程 类里面的全部存储型属性--包含全部继承自父类的属性--都必须在构造过程中设置初始值. Swift 提供了两种类型的类构造器来确保全部类实例中存储型属性都能获得初始值,它们各自是指定构造器和便利构造器. 指定构造器和便利构造器 指定构造器是类中最基本的构造器.一个指定构造器将初始化类中提供的全部属性,并依据父类链往上调用父类的构造器来实现父类的初始化. 每个类都必须拥有至少一个指定构造器.在某些情况下,很多类通过继承了父类中的指定构造器而满足了这个条件.详细内容请參考兴许章节自