Swift学习笔记笔记(五) Swift扩展协议类

news2024/12/30 3:24:21

一、 实验目的:

1.掌握Swift扩展型
2.掌握Swift协议
3.掌握Swift类

二、实验原理:

1.Swift扩展的定义
2.Swift协议的定义
3.Swift类的定义

三、实验步骤及内容:

1.方法

//实例方法
class Website {
var visitCount = 0
func visiting(){
visitCount += 1
}
}
let sina = Website()
sina.visitCount
sina.visiting()
sina.visitCount
sina.visiting()
sina.visitCount
//带参数的方法
class Website {
var visitCount = 0
var visitor = String
var visitDate = “”
func visiting(visitor: String, visitDate : String){
visitCount += 1
self.visitor.append(visitor)
self.visitDate = visitDate
}
}
let sina = Website()
sina.visiting(visitor: “Tommy”, visitDate: “2016-6-1”)
sina.visitCount
sina.visitor
sina.visitDate
//类型方法
class Website {
static var visitCount = 0
static var visitor = String
static var visitDate = “”
static func visiting(visitor:String, visitDate : String){
visitCount += 1
self.visitor.append(visitor)
self.visitDate = visitDate
}
}
Website.visiting(visitor:“Tommy”, visitDate: “2016-6-1”)
Website.visitCount
Website.visitor
Website.visitDate
//结构体可变方法
struct Website {
var visitCount = 0
mutating func visiting() {
visitCount += 1
}
}
var sohu = Website()
sohu.visiting()
print(“(sohu.visitCount)”)
//下标方法
class Website {
var visitCount = 0
var visitor = String
var visitDate = “”
func visiting(visitor:String, visitDate : String){
visitCount += 1
self.visitor.append(visitor)
self.visitDate = visitDate
}
subscript(index : Int) -> String {
get {
return visitor[index]
}
set {
visitor[index] = newValue
}
}
}
var sina = Website()
sina.visiting(visitor: “Tom”, visitDate: “2016-6-3”)
sina.visiting(visitor: “Sam”, visitDate: “2016-6-9”)
print(“(sina[0])”)
sina[1] = “Pennie”
print(“(sina[1])”)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.类

//基类
class Student {
var name = “”
var age = 0
var id = “”
var basicInfo : String {
return “(name) is (age) years old, the id is (id”
}
func chooseClass(){
print(“(name) choose a class.”)
}
func haveClass(){
print(“(name) have a class.”)
}
}
let theStudent = Student()
theStudent.name = “Tommy”
theStudent.age = 19
theStudent.id = “37060115”
print(theStudent.basicInfo)
//子类
class Graduate : Student {
var supervisor = “”
var researchTopic = “”
func chooseSuperVisor(superVisor:String){
self.supervisor = superVisor
}
}
let theGraduate = Graduate()
theGraduate.name = “Sam”
theGraduate.age = 23
theGraduate.id = “SY0602115”
theGraduate.haveClass()
theGraduate.researchTopic = “Graphics”
theGraduate.chooseSuperVisor(superVisor: “Ian”)
print(“Graduate (theGraduate.name) is (theGraduate.age) and the id is (theGraduate.id), The research topic is (theGraduate.researchTopic) and supervisor is (theGraduate.supervisor)”)
//子类的子类
class Doctor: Graduate {
var articles = String
func publishArticle(article : String){
articles.append(article)
}
}

let theDoctor = Doctor()
theDoctor.name = “Pennie”
theDoctor.age = 26
theDoctor.id = “BY0607120”
theDoctor.basicInfo
theDoctor.chooseSuperVisor(superVisor: “Ellis”)
theDoctor.supervisor
theDoctor.publishArticle(article: “Petri nets theory”)
theDoctor.publishArticle(article: “Process management”)
theDoctor.articles
//多态性
class Student {
var name = “”
var age = 0
var id = “”
var basicInfo : String {
return “(name) is (age) years old, the id is (id”
}
func chooseClass(){
print(“(name) choose a class.”)
}
func haveClass(){
print(“(name) have a class.”)
}
}
class Graduate : Student {
var supervisor = “”
var researchTopic = “”
override var age : Int {
didSet {
print(“age is set from (oldValue) to (age”)
}
willSet {
print(“original age will be set to (newValue)”)
}
}
override var basicInfo: String{
return super.basicInfo + “, supervisor is (supervisor), research topic is (researchTopic)”
}
func chooseSuperVisor(superVisor:String){
self.supervisor = superVisor
}
override func chooseClass() {
print(“graduate (name) choose a class”)
}
}
func sportGameRoster(stu:Student)->String{
return “Athlete name:(stu.name),age:(stu.age),id:(stu.id)”
}

let studenteTom=Student()
studenteTom.name=“Tom”
studenteTom.age=19
studenteTom.id=“37060116”

let graduateJim=Graduate()
graduateJim.name=“Jim”
graduateJim.age=24
graduateJim.id=“SY060218”
let rosterTom=sportGameRoster(stu: studenteTom)
let rosterJim=sportGameRoster(stu: graduateJim)
在这里插入图片描述

3.扩展

//扩展计算属性
extension Int {
var kg : Int {return self * 1000 }
var ton : Int {return self * 1000000}
}
var aChick = 2.kg
var aElephant = 8.ton
print(“aClick is (aChick)g”)
print(“aElephant is (aElephant)g”) //扩展计算属性
extension Int {
var kg : Int {return self * 1000 }
var ton : Int {return self * 1000000}
}
var aChick = 2.kg
var aElephant = 8.ton
print(“aClick is (aChick)g”)
print(“aElephant is (aElephant)g”)
//扩展构造器
struct Student {
var name : String
var id : String
var age : Int
init(){
name = “”
id = “”
age = 0
}
}
extension Student {
init(name : String, id : String, age : Int){
self.name = name
self.id = id
self.age = age
}
}
let theStudent = Student(name: “Jack”, id: “37060115”, age: 18)
//扩展方法
struct Student {
var name : String
var id : String
var age : Int
init(){
name = “”
id = “”
age = 0
}
}
extension Student {
init(name : String, id : String, age : Int){
self.name = name
self.id = id
self.age = age
}
func description(){
print(“(name)'s age is (age) and id is (id)”)
}
}
let theStudent = Student(name: “Jack”, id: “37060115”, age: 18)
theStudent.description()
//扩展下标
struct Student {
var name : String
var id : String
var age : Int
init(){
name = “”
id = “”
age = 0
}
}
extension Student {
init(name : String, id : String, age : Int){
self.name = name
self.id = id
self.age = age
}
}
struct Class {
var students = Student
}
extension Class {
subscript(Index : Int) -> String{
return students[Index].name
}
}

var theClass = Class()
theClass.students.append(Student(name: “Sam”, id: “0”, age: 16))
theClass.students.append(Student(name: “Tom”, id: “1”, age: 18))
theClass.students.append(Student(name: “Jeff”, id: “2”, age: 19))
let oneStudentName = theClass[0]
print(oneStudentName)
在这里插入图片描述

4.协议

//协议的声明
protocol Person {
var name: String { get set}
var age: Int { get }
}
//类遵守协议
class Student: Person {
var name : String
var age : Int
init(){
name = “”
age = 0
}
}
//协议中的关联类型
protocol Person {
associatedtype UnknownType
var name: String { get set}
var age: Int { get }
var weight: UnknownType { get }
}
class Student: Person {
var name : String
var age : Int
var weight: Double
init(){
name = “”
age = 0
weight = 0.0
}
}
//协议中的关联类型
protocol Person {
associatedtype UnknownType
var name: String { get set}
var age: Int { get }
var weight: UnknownType { get }
}
class Student: Person {
var name : String
var age : Int
var weight: Double
init(){
name = “”
age = 0
weight = 0.0
}
}
//协议中的关联类型
protocol Person {
associatedtype UnknownType
var name: String { get set}
var age: Int { get }
var weight: UnknownType { get }
}
class Student: Person {
var name : String
var age : Int
var weight: Double
init(){
name = “”
age = 0
weight = 0.0
}
}
//协议的继承性
protocol Person {
associatedtype UnknownType
var name : String {get set}
var age : Int {get set}
var weight: UnknownType { get }
func personDescription()
}
protocol Student {
var school : String {get set}
func studentDescription()
}
protocol Graduate : Person, Student {
var supervisor : String {get set}
func graduateDescription()
}
class ComputerAssociationMember : Graduate {
var name : String = “”
var age : Int
var weight: Double
var school : String
var supervisor : String
func personDescription() {
print(“It’s person description”)
}
func studentDescription() {
print(“It’s student description”)
}
func graduateDescription() {
print(“It’s graduate description”)
}
init(name : String, age : Int, weight: Double, school : String, supervisor :String){
self.name = name
self.age = age
self.weight = weight
self.school = school
self.supervisor = supervisor
}
}
let theMember = ComputerAssociationMember(name: “Tom”, age: 23, weight: 69.2, school: “BUAA”, supervisor: “Ian”)
theMember.personDescription()
theMember.studentDescription()
theMember.graduateDescription()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、实验结果与分析:

本次实验,我主要学习了Swift扩展&协议&类的使用。在本次的实验学习中,有时候会因为对基本概念不熟悉,导致编写语法使用不恰当,导致运行结果出错,但最后经过不但的改进与尝试,最后的结果都是可以正常运行出来的。

五、实验总结:

通过本次课程的学习,主要的了解如下:Swift中有三种type(类型):class(类),struct(结构体),enum(枚举):
这三个类型的区别在于class是引用类型,而另外两个是值类型。区别在于,引用类型的对象是可以动态分配的(可以变化),而值类型的对象在初始化时一般就分配好了(不准改动)。而mutating关键字则允许在它修饰的方法中去修改对象本身的值或对象属性的值(self或self.xxx的值)。
1.如果协议仅针对class,不需要mutating关键字。
2.如果协议会被enum或struct使用,协议中的方法需要mutating修饰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LC】二叉树应用强化OJ

✨博客主页: 心荣~ ✨系列专栏:【LeetCode/牛客刷题】 ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录1. 检查两颗树是否相同2. 另一颗树的子树3. 二叉树最大深度4. 判断—颗二叉树是否是平衡二叉树5. 对称二叉树6. 二叉树的构建及遍历7. 二叉树的分层遍历8. 给定一个二叉树…

JAVAweb第一次总结作业

1.什么是html HTML的全称为超文本标记语言(Hyper Text Markup Language),是一种标记语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。 HTML文本是由HTML命令组成的描述性文本&…

【Python】import模块的多种操作

前言 记录一下关于Python在导入模块时候一些操作~ 知识点📖📖 Python魔法方法:__all__ Python内置模块:importlib 实现 指定导出的变量 当你在使用 from xxx import * 时候,可以通过 __all__ 来指定可被导出的变…

每天五分钟机器学习:通过学习曲线判断模型是过拟合还是欠拟合

本文重点 本节课程我们学习使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线其实就是训练误差和验证误差关于样本m的曲线,我们将通过学习曲线来判断该算法是处于高偏差问题,还是处于高方差问题。 高偏差问题(欠拟合) 注意:这个m表示训练集数据样本…

王二涛研究组揭示丛枝菌根共生与根瘤共生的协同进化机制

2021年,中国科学院分子植物科学卓越创新中心王二涛团队在《Molecular Plant》发表了“Mycorrhizal Symbiosis Modulates the Rhizosphere Microbiota to Promote Rhizobia Legume Symbiosis”研究论文,该研究通过定量微生物组、微生物共发生网络及微生物…

mac for m1(arm):安装redis的四种方式(本机安装、homebrew安装、虚拟机安装、docker安装)

0. 引言 redis作为当今最常用的非关系型数据库,被广泛应用于数据缓存场景。而mac m1采用arm芯片,使得众多软件安装成为问题,今天我们来看mac m1如何安装redis 1.本机安装redis 1、下载redis安装包:https://redis.io/download/ …

subplots()--matplotlib

1. 函数功能 成一个画布和若干子区。2. 函数语法 matplotlib.pyplot.subplots(nrows1, ncols1, *, sharexFalse, shareyFalse, squeezeTrue, subplot_kwNone, gridspec_kwNone, **fig_kw)3. 函数参数与示例 参数含义nrows, ncols画布被分成的行、列数squeeze布尔值&#xf…

【畅购商城】用户登录

用户登录 构建页面&#xff1a;Login.vue步骤一&#xff1a;创建Login.vue步骤二&#xff1a;绘制通用模块<template> <div> <TopNav></TopNav> <div style"clear:both;"></div> <HeaderLogo></HeaderLogo> <div…

嵌入式开发--CubeMX使用入门教程

嵌入式开发–CubeMX使用入门教程 CubeMX简介 传统的单片机开发时&#xff0c;需要针对片上外设做各种初始化的工作&#xff0c;相当麻烦。 CubeMX是ST公司出品的一款图形化代码生成工具&#xff0c;通过图形化界面&#xff0c;可以非常直观的配置好各种片上外设&#xff0c;时…

一个方便IO单元测试的C#扩展库

对于我们.Net程序员&#xff0c;System.Web.Abstractions我们都非常熟悉&#xff0c;主要作用于Web可以实现单元测试&#xff0c;他是在.Net framework 3.5 sp1开始引入的,很好的解决项目表示层不好做单元测试的问题&#xff0c;这个库所有类都是Wrapper/Decorator模式的。今天…

[SpringBoot] Spring Boot注册Web原生组件/拦截器HandlerInterceptor

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

风控建模坏样本太少,不要再用过采样和欠采样了,试下这种更有效的方法

样本数据不平衡是我们建模场景中经常遇到的问题&#xff0c;由于目标类别的分布占比差异较大&#xff0c;使得模型训练难以取得较好的拟合效果&#xff0c;甚至模型结果在实际应用中无效。举个最常见的例子&#xff0c;在信贷场景中构建反欺诈模型时&#xff0c;训练样本数据的…

(附源码)计算机毕业设计SSM垃圾分类综合服务系统

&#xff08;附源码&#xff09;计算机毕业设计SSM垃圾分类综合服务系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

(27)语义分割--cityscape数据集的读取和使用

1、主要参考 (1) 图像分割cityscape数据集使用介绍 - 知乎 (2)torchvision支持很多现成的数据集 Datasets — Torchvision 0.13 documentation 。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。 2、下载…

CTFHub | 整数型注入

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

【Vue 快速入门系列】列表的基本使用

文章目录前言列表的基本使用Key的原理列表过滤列表排序前言 本篇文章讲述Vue中最基本的列表使用&#xff0c;如何迭代列表取值&#xff0c;如何对列表进行过滤、排序等。 列表的基本使用 在Vue中使用列表的时候灰常简单&#xff0c;只需要将Vue属性内的列表数据与dom标签进行…

[架构之路-57]:目标系统 - 平台软件 - 用户空间驱动与硬件抽象层HAL

目录 前言&#xff1a; 第1章 驱动程序功能设计 1.1 关于用户空间驱动 1.2 硬件驱动程序的四大功能概述 1.3 OAM管理面功能&#xff1a;站在管理源的角度&#xff0c;看如何监控使能和监控硬件。 1.4 控制面功能&#xff1a;站在业务的角度看&#xff0c;如何使能和监控硬…

基于Android的五子棋游戏APP设计

目 录 第一章&#xff1a;绪论 1 1.1智能手机与Android系统的发展历程 1 1.1.1 智能手机 1 1.1.2 Android系统基本情况介绍 2 1.2课题现状及应用前景 3 1.2.1 五子棋简介 3 1.2.2 课题现状及应用前景 3 第二章&#xff1a;开发环境的搭建 5 2.1 系统开发环境 5 2.2 系统开发环境…

SpringCould(一)

视频链接&#xff1a;https://www.bilibili.com/video/BV1f94y1U7AB/?vd_source9545770e4a2968c05878ffac8589ec6c 视频选集&#xff1a;P1— P15 文章目录1.微服务简介1.1 单体架构不足1.2 微服务1.3 微服务的特点1.4 微服务的自动部署&#xff08;CI/CD&#xff09;(持续集成…

一文了解数据结构

目录 数据结构 什么是数据结构 链表 数组 栈 队列 哈希表 堆 数据结构 什么是数据结构 「数据结构」决定了数据的顺序和位置关系.数据存储于内存时&#xff0c;决定了数据顺序和位置关系的便是「数据结构」 链表 「链表」中的数据呈线性排列。链表中添加删除数据比较…