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

最近在学习swift,期间也看了不少教程和大神的博客,最后把笔记放这里,方便查看复习~swift

附上学习资料地址:w3cschool-Swift 教程YungFan大神的简书(推荐看一下,有些知识点总结地简直通俗易懂)markdown

1、枚举

一、介绍

enum:枚举是一种类型,能够像类和结构体同样,拥有本身的属性和方法函数

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

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


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

经过rawValue获取枚举值设定的原始值学习

注意:spa

  • 原始值区分大小写
  • 经过rawValue返回的枚举是一个可选型,由于原始值对应的枚举值不必定存在
  • 若是是int类型,只指定第一个元素的原始值以后,后面的元素的原始值可以默认+1

二、使用

遍历:code

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

2、结构体

一、介绍

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

注意:对象

  • 结构体实例老是经过值传递来定义你的自定义数据类型。继承

  • 结构体老是经过被复制的方式在代码中传递,所以它的值是不可修改的。

  • 若是要在成员方法中去改变成员属性,须要关键字mutating

二、初始化

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岁
复制代码

三、应用场景

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

四、实例场景

  • 几何形状的大小,封装一个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
复制代码

3、类

一、介绍

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

二、使用

定义:

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)
复制代码

4、 structclass比较

struct是结构体,class是类

  • 一、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
复制代码
  • 二、struct不能被继承,class能够被继承

  • 三、用let修饰class对象,可以修改类的值;若要修改struct的值,要用var来修饰

  • 四、struct是放在栈上,class是放在堆上,所以struct的访问速度更快

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

  • 六、全部的struct都有一个自动生成的成员构造器,而class须要本身生成

  • 七、在struct中,成员变量能够没有初始值;但在class中,若是成员变量没有初始值,就必须为它写一个构造函数

相关文章
相关标签/搜索