定义

// 定义类
class StudentC{
}
// 定义结构体
struct StudentS{
}

定义存储属性

// 定义类
class StudentC{
var name:String = "yhx"
}
// 定义结构体
struct StudentS{
var name:String
}
注意:在类中定义属性必须要注意,如果你定义的存储属性不是可选值类型,必须进行初始化,不然编译会报错,但是结构体不会报错,因为系统默认会给结构体创建初始化方法

定义函数

// 定义类
class StudentC{
static var des:String = "学生的类"
var name:String!
func getName()->String{
return name
} class func describe()->String{
return des
} static func getClassDescribe()->String{
return des
}
} // 定义结构体
struct StudentS{
static var des:String = "学生的结构体"
var name:String
static func describe()->String{
return "这是一个定义学生的类"
}
}
//类可以使用关键字static class 修饰方法,但是结构体只能使用关键字static修饰

扩展下标

class StudentC{
var names:[String] = ["","","","",""]
subscript (index:Int)->String?{
get{
if names.count <= index{
return nil
}
return names[index]
}
}
} // 定义结构体
struct StudentS{
var names:[String] = ["","","","",""]
subscript (index:Int)->String?{
get{
if names.count <= index{
return nil
}
return names[index]
}
}
} // 执行
let student1 = StudentC()
print(student1[3])

初始化

// 定义类
class StudentC{
var name:String
init( name:String) {
self.name = name
}
} // 定义结构体
struct StudentS{
var name:String
init(name:String) {
self.name = name
}
}
let student1 = StudentC(name: "yhx1")
let student2 = StudentS(name: "yhx2")

结构体默认会有初始化方法

struct StudentS{
  var name:String
}
let student2 = StudentS(name: "yhx")

扩展功能

extension StudentC{
func describe()->String{
return "学生" + self.name
}
}
extension StudentS{
func describe()->String{
return "学生" + self.name
}
}

实现协议

// 定义一个协议
protocol Capacity{
func draw() // 协议方法
}
// 定义类
class StudentC:Capacity{
// 实现协议方法
internal func draw() {
}
var name:String
init( name:String) {
self.name = name
}
}
// 定义结构体
struct StudentS:Capacity{
// 实现协议方法
internal func draw() {
}
var name:String
}

继承

// 定义基类
class Person{
var name:String
init( name:String) {
self.name = name
}
}
// 定义类
class StudentC:Person{
var score:Float
init( name:String,score:Float) {
self.score = score
super.init(name: name)
self.name = name
}
}
提示:结构体不能继承结构体

mutating 关键字的作用

/*结构体和枚举都是值类型,但是默认值类型的对象方法不能修改属性值,但是要修改怎么办呢?就必须在函数前面加mutating*/
//例子1
protocol Action{
var myY:Int{ mutating get}
}
struct Point{
var x:Int
var y:Int
// 结构体或者枚举修改值必须在函数前面加mutating
mutating func modifyX(x:Int){
self.x = x
}
// 注意计算属性,mutating 要加载getter方法前面
var myY:Int{
mutating get {
self.y = self.y*
return y
}
}
}
// 例子2
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
// 例子3
enum TriStateSwitch {
case off, low, high
mutating func next() {
switch self {
case .off:
self = .low
case .low:
self = .high
case .high:
self = .off
}
}
}
/*提示:
1.计算属性setter方法不用修改属性值不用添加mutating
2.计算属性setter方法中修改属性值的时候,一定要加mutating
*/

检测两个对象地址是不是相同

class StudentC{
var name:String
init( name:String) {
self.name = name
}
}
let student1 = StudentC(name: "yhx")
let student2 = student1
if student1 === student2{
print("地址相同")
}
//运行结果:地址相同
注意:类是引用类型,结构体是值类型,不能使用===/!== 判断地址

Deinitializers使一个类的实例来释放任何资源分配

// 定义类
class StudentC{
var name:String
init( name:String) {
self.name = name
}
deinit {
// 释放资源
}
}
//提示:结构体没有deinit 方法

高级话题

1.创建相同属性的结构体比类更加节省内存

2. 什么时候用结构体

1.该结构的主要目的是封装几个相对简单的数据值
2.如果你希望你的结构在传递的时候被赋值而不是引用
3.希望结构在传递的时候,内部的属性也被复制而不是引用
4.不需要继承属性或者方法

主要应用场景(只包含非对象类型)

1.定义Size
2.定义范围Range
3.定义坐标XYZ
...

学习swift从青铜到王者之swift结构体和类08的更多相关文章

  1. 学习swift从青铜到王者之swift属性09

    1.结构体常量和类常量的存储属性 let p1 = Person1() //p1.age = 88 不允许修改 //p11.name = "yhx1" 不允许修改 var p11 ...

  2. 学习swift从青铜到王者之swift闭包06

    语法表达式 一般形式:{ (parameters) -> returnType in statements } 这里的参数(parameters),可以是in-out(输入输出参数),但不能设定 ...

  3. 学习swift从青铜到王者之swift枚举07

    空枚举 //空枚举 enum SomeEnumeration { // enumeration definition goes here } 枚举基本类型 //枚举基本类型 enum CompassP ...

  4. 学习swift从青铜到王者之Swift语言函数05

    1.定义一个函数以及调用 //一,定义一个无参无返回值函数 func fun1(){ print("this is first function") } fun1() 2.定义一个 ...

  5. 学习swift从青铜到王者之Swift控制语句04

    1 if语句基本用法 if boolean_expression { /* 如果布尔表达式为真将执行的语句 */ } 如果布尔表达式为 true,则 if 语句内的代码块将被执行.如果布尔表达式为 f ...

  6. 学习swift从青铜到王者之Swift集合数据类型03

    1 数组的定义 var array1 = [,,,] var array2: Array = [,,,] var array3: Array<Int> = [,,,] var array4 ...

  7. 学习swift从青铜到王者之swift基础部分01

    1.1 变量和常量 var 变量名称 = 值(var可以修改) let 常量名称 = 值(let不可以修改) 1.2 基本数据类型 整数类型和小数类型 两种基本数据类型不可以进行隐式转换 var in ...

  8. Swift具体解释之六----------------枚举、结构体、类

    枚举.结构体.类 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正,一起学习. 1.枚举 枚举是用来定义一组通用类型的一组相关值 ,关键字enum ...

  9. Swift结构体与类

    在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...

随机推荐

  1. Java实现Web页面前数字字母验证码实现

    最近公司做项目开发中用到了验证码实现功能,将实现代码分享出来, 前段页面实现代码: 为了表达清晰,样式部分代码去掉了,大家根据自己的需求,自己添加样式. 页面JS代码:触发变动验证码改变的JS 后台 ...

  2. TensorFlow中屏蔽warning的方法

    问题 使用sudo pip3 install tensorflow安装完CPU版tensorflow后,运行简单的测试程序,出现如下警告: I tensorflow/core/platform/cpu ...

  3. 5 秒创建 k8s 集群[转]

    据说 Google 的数据中心里运行着超过 20 亿个容器,而且 Google 十年前就开始使用容器技术. 最初,Google 开发了一个叫 Borg 的系统(现在命令为 Omega)来调度如此庞大数 ...

  4. Unity整合Asp.Net MVC

    先来看一下我们的解决方案 我们建立Yubay.Models项目, using System; using System.Collections.Generic; using System.Data.E ...

  5. mkdir touch vim

    vim和touch都用于新建文件 mkdir用于新建文件夹

  6. matlab 随笔

    <<matlab高级编程技巧与应用:45个案例分析>> 一. 重新认识向量化编程 1.向量化编程与循环的比较 2.预分配内存更好 3.matlab中是列优先 4.归一化 数据归 ...

  7. treeTable的使用(ajax异步获取数据,动态渲染treeTable)

    一.展示效果(treetable基本样式https://www.cnblogs.com/shuihanxiao/p/10413454.html) 二.html文件(若一个页面又多个treetable, ...

  8. python之道03

    1.有变量name = " aleX leNb " 完成如下操作: 移除 name 变量对应的值两边的空格,并输出处理结果 答案: name = " aleX leNb ...

  9. UVa-133-救济金发放

    这题的话,我们首先对于移动函数可以知道,因为只是顺逆的关系,也就是加一或者减一,所以我们每次移动的时候,都补上一个小于n的最大整数,然后取模,这样就不会有负数,而且加之后的结果不会超过2*n,所以我们 ...

  10. linux批量检测服务器能否ping通和硬盘容量状态并抛出报警的一个脚本-附详细解释

    有一些linux基础,最近刚开始学shell,参考了阿良老师的一个监测服务器硬盘状态的脚本,自己进行了一些扩展,今天比较晚了,后边会把注释放上来,感觉脚本还很不完善,希望大家一起探讨一下,共同学习 2 ...