博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习swift从青铜到王者之swift结构体和类08
阅读量:5020 次
发布时间:2019-06-12

本文共 3866 字,大约阅读时间需要 12 分钟。

定义

// 定义类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] = ["1","2","3","4","5"]    subscript (index:Int)->String?{        get{            if names.count <= index{                return nil            }            return names[index]        }    }}// 定义结构体struct StudentS{    var names:[String] = ["1","2","3","4","5"]    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*///例子1protocol 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*2            return y        }    }}// 例子2struct 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)    }}// 例子3enum TriStateSwitch {    case off, low, high    mutating func next() {        switch self {        case .off:            self = .low        case .low:            self = .high        case .high:            self = .off        }    }}/*提示:1.计算属性setter方法不用修改属性值不用添加mutating2.计算属性setter方法中修改属性值的时候,一定要加mutating */

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

class StudentC{    var name:String    init( name:String) {        self.name = name    }}let student1 = StudentC(name: "yhx")let student2 = student1if 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
...

转载于:https://www.cnblogs.com/jiackyan/p/7992918.html

你可能感兴趣的文章
销售类
查看>>
技术项目,问题
查看>>
线程池总结
查看>>
Learning to rank (software, datasets)
查看>>
git常见问题
查看>>
.NETFramework:template
查看>>
HM16.0之帧内模式——xCheckRDCostIntra()函数
查看>>
Jmeter性能测试 入门
查看>>
安卓动画有哪几种?他们的区别?
查看>>
Nodejs学习总结 -Express入门(一)
查看>>
web前端优化
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
设计网站大全
查看>>
JVM CUP占用率过高排除方法,windows环境
查看>>
【转】JAVA字符串格式化-String.format()的使用
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>