swift-04-枚举、结构体、类

swift-04-枚举、结构体、类

一、枚举

1、介绍

enum:枚举是一种类型,可以像类和结构体一样,拥有自己的属性和方法

swift中的枚举,可以提供的值类型有:字符串,字符,整型值,浮点值等。这一点不同于oc,oc中是默认整型值

//定义Int类型的枚举
enum CompassPoint:Int {
  case North
  case South
  case East
  case West
}


let stt: CompassPoint = .South
//通过rawValue拿到原始值,因为是int类型,默认从0开始
print(stt.rawValue)
复制代码

通过rawValue获取枚举值设定的原始值

注意:

  • 原始值区分大小写
  • 通过rawValue返回的枚举是一个可选型,因为原始值对应的枚举值不一定存在
  • 如果是int类型,只指定第一个元素的原始值之后,后面的元素的原始值能够默认+1

2、使用

遍历:

//通过声明的时候添加 CaseIterable 来允许遍历
enum CompassPoint:Int, CaseIterable {
  case North
  case South
  case East
  case West
}
//通过allCases进行遍历
for method in CompassPoint.allCases {
    print(method)
}
复制代码

二、结构体

1、介绍

struct:声明结构体,内部可以声明成员变量、成员方法。因此更接近于一个类,可以说是类的一个轻量化实现

注意:

  • 结构体实例总是通过值传递来定义你的自定义数据类型。

  • 结构体总是通过被复制的方式在代码中传递,因此它的值是不可修改的。

  • 如果要在成员方法中去改变成员属性,需要关键字mutating

2、初始化

struct Person {
    var name = "Zhangsan"
    var age = 10
    var sex = "man"
    func say(){
        print("人会说话")
    }
}


//初始化写法1:只有成员变量拥有默认值的时候才能使用
var p1 = Person()


//初始化写法2:重新赋值
var p2= Person(name: "Lisi", age: 20, sex: "woman")

复制代码

代码示例:

//声明:
struct Person {
    var name:String
    var age:Int
    
    func introduce(){
        print("我叫:\(name),今年\(age)岁")
    }
}

//调用:
var person = Person(name: "xiaoMing",age: 20)

person.introduce()

//输出:
我叫:xiaoMing,今年20岁
复制代码

3、应用场景

  • 结构体的主要目的是用来封装少量相关简单数据值。
  • 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
  • 任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
  • 结构体不需要去继承另一个已存在类型的属性或者行为。

4、实例场景

  • 几何形状的大小,封装一个width属性和height属性,两者均为Double类型。
  • 一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。
  • 三维坐标系内一点,封装x,y和z属性,三者均为Double类型。

不同情况的操作:

//声明方式1:直接给成员变量赋值
struct myStruct1 {
    var num1 = 100
    var num2 = 200
    var num3 = 300
}

//声明方式2:成员变量通过初始化参数进行赋值
struct myStruct2 {
    var num1: Int
    var num2: Int
    var num3: Int
    
    init(mark: Int) {
        self.num1 = mark
        self.num2 = mark * 2
        self.num3 = mark * 3
    }
}
复制代码

调用:

let stu1 = myStruct1()
print(stu1.num1,stu1.num2,stu1.num3)

let stu2 = myStruct2(mark: 500)
print(stu2.num1,stu2.num2,stu2.num3)

//值拷贝
var stu3 = stu2
print("修改前: \(stu3.num1)")
stu3.num1 = 600
print("修改后: \(stu3.num1)")
复制代码

打印:

100 200 300
500 1000 1500
修改前: 500
修改后: 600
复制代码

三、类

1、介绍

class: swift中用class关键字定义类,通过.(点语法)进行访问类的属性和方法

2、使用

定义:

class Person {
    var name = "Zhangsan"
    var age = 10
  
    func say(){
        print("\(name)说话了")
    }
}

//调用
var p1 = Person()
p1.say()
复制代码

注意:类默认没有自动实现构造函数,如果声明成员变量的时候没有赋值,就需要实现构造函数来进行赋值,否则无法编译

class Person {
    var name : String
    var age : Int

    init(name : String, age : Int) {
         
        self.name = name
        self.age = age
    }
 
}

//调用
var p1 = Person(name: "zhangsan", age: 10)
复制代码

四、 struct和 class比较

struct是结构体,class是类

  • 1、struct是值类型,class是引用类型;意思是:声明一个新的变量指向这个结构体,改变某个属性,原本的结构体属性不会发生变化;而类会随着改变

代码示例:

struct myStru {
    var width = 200
}

class myClass {
    var width = 200
}


//调用
var stu = myStru()
var stu2 = stu
stu2.width = 300
print(stu.width,stu2.width)
//200  300


var cls = myClass()
var cls2 = cls
cls2.width = 300
print(cls.width,cls2.width)
//300 300
复制代码
  • 2、struct不能被继承,class可以被继承

  • 3、用let修饰class对象,能够修改类的值;若要修改struct的值,要用var来修饰

  • 4、struct是放在栈上,class是放在堆上,因此struct的访问速度更快

  • 5、struct里面如果想声明一个func来修改声明的属性,需要添加关键字mutating,才能编译成功;而class不需要

  • 6、所有的struct都有一个自动生成的成员构造器,而class需要自己生成

  • 7、在struct中,成员变量可以没有初始值;但在class中,如果成员变量没有初始值,就必须为它写一个构造函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值