(作业)Swift枚举、类、派生、协议

OC与Swift混编 注意事项 前言 随着Swift发展, 很多新的项目开始使用Swift作为首选语言。 Swift语言以其简捷,快速的特点获得了一大波粉丝,我也是其中之一。 项目背景:公司一些旧项目大都使用OC编写, 运营中的项目也会时常维护。所以在新需求开发时,我也会尝试使用Swift语言来编写(使用OC还是Swift根据项目需要来),这就涉及到OC与Swift语言的混编。 大部分的情况是OC代码调用部分Swift编写的模块。 而在混编的过程也遇到了一些问题,本文就将这些问题一一整理出来。 注意事项 1.oc调用swift的类 sw 阅读详情

此次作业为第二个作业《Swift类的属性与方法》的补充,照常,先贴要求

这里写图片描述

定义Gender枚举

//性别的枚举
enum Gender: Int {
    case male    //男性
    case female  //女性
    case unknow  //未知

    //重载>操作符,方便后面排序使用
    static func >(lhs: Gender, rhs: Gender) -> Bool {
        return lhs.rawValue < rhs.rawValue
    }
}

定义Department枚举

//公寓的枚举
enum Department {
    case one, two, three
}

定义SchoolProtocol协议

//学校协议
protocol SchoolProtocol {
    var department: Department { get set }
    func lendBook()
}

定义Person类并实例化

//人类
class Person: CustomStringConvertible  {
    var firstName: String  //姓
    var lastName: String  //名
    var age: Int  //年龄
    var gender: Gender  //性别

    var fullName: String {  //全名
        get {
            return firstName + lastName
        }
    }

    //构造方法
    init(firstName: String, lastName: String, age: Int, gender: Gender) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
        self.gender = gender
    }

    convenience init(firstName: String, age: Int, gender: Gender) {
        self.init(firstName: firstName, lastName: "", age: age, gender: gender)
    }

    convenience init(firstName: String) {
        self.init(firstName: firstName, age: 0, gender: Gender.unknow)
    }

    required convenience init() {
        self.init(firstName: "")
    }

    //重载==
    static func ==(lhs: Person, rhs: Person) -> Bool {
        return lhs.fullName == rhs.fullName && lhs.age == rhs.age && lhs.gender == rhs.gender
    }

    //重载!=
    static func !=(lhs: Person, rhs: Person) -> Bool {
        return !(lhs == rhs)
    }

    //实现CustomStringConvertible协议中的计算属性,可以使用print直接输出对象内容
    var description: String {
        return "fullName: \(self.fullName), age: \(self.age), gender: \(self.gender)"
    }

    //输出Person XXX is running
    func run() {
        print("Person \(self.fullName) is running")
    }
}

var p1 = Person(firstName: "张")
var p2 = Person(firstName: "张", age: 20, gender: .male)
print(p1)  //输出fullName: 张, age: 0, gender: male
print(p1 == p2)  //输出false
print(p1 != p2)  //输出true

定义Teacher类并实例化

//教师类
class Teacher: Person, SchoolProtocol {
    var title: String  //标题
    var department: Department  //公寓

    //构造方法
    init(title: String, firstName: String, lastName: String, age: Int, gender: Gender, department: Department) {
        self.title = title
        self.department = department
        super.init(firstName: firstName, lastName: lastName, age: age, gender: gender)
    }

    init(title: String, department: Department) {
        self.title = title
        self.department = department
        super.init(firstName: "", lastName: "", age: 0, gender: .unknow)
    }

    convenience required init() {
        self.init(title: "", department: Department.one)
    }

    //重写父类的计算属性
    override var description: String {
        return "title: \(self.title), fullName: \(self.fullName), age: \(self.age), gender: \(self.gender), department: \(self.department)"
    }

    //重载父类run方法
    override func run() {
        print("Teacher \(self.fullName) is running")
    }

    //遵循协议的方法
    func lendBook() {
        print("Teacher \(self.fullName) lend a book")
    }
}

var t1 = Teacher(title: "hello", department: .one)
print(t1)  //输出title: hello, fullName: , age: 0, gender: unknow, department: one

定义Student类并实例化

//学生类
class Student: Person, SchoolProtocol {
    var stuNo: Int  //学号
    var department: Department  //公寓

    //构造方法
    init(stuNo: Int, firstName: String, lastName: String, age: Int, gender: Gender, department: Department) {
        self.stuNo = stuNo
        self.department = department
        super.init(firstName: firstName, lastName: lastName, age: age, gender: gender)
    }

    init(stuNo: Int, department: Department) {
        self.stuNo = stuNo
        self.department = department
        super.init(firstName: "", lastName: "", age: 0, gender: Gender.unknow)
    }

    required convenience init() {
        self.init(stuNo: 0, department: .one)
    }

    //重写父类的计算属性
    override var description: String {
        return "stuNo: \(self.stuNo), fullName: \(self.fullName), age: \(self.age), gender: \(self.gender), department: \(self.department)"
    }

    //重载父类run方法
    override func run() {
        print("Student \(self.fullName) is running")
    }

    //遵循协议的方法
    func lendBook() {
        print("Teacher \(self.fullName) lend a book")
    }
}

var s1 = Student(stuNo: 2015110101, department: .two)
print(s1)  //输出stuNo: 2015110101, fullName: , age: 0, gender: unknow, department: two

对数组执行操作

//初始化一个空的Person数组
var array = [Person]()

//生成5个Person对象
for i in 1...5 {
    let temp = Person(firstName: "张", lastName: "\(i)", age: 20, gender: .male)
    array.append(temp)
}
//生成3个Teacher对象
for i in 1...3 {
    let temp = Teacher(title: "hello", firstName: "李", lastName: "\(i)", age: 21, gender: .female, department: .one)
    array.append(temp)
}
//生成4个Student对象
for i in 1..<5 {
    let temp = Student(stuNo: 2015110100 + i, firstName: "王", lastName: "\(i)", age: 19, gender: .male, department: .two)
    array.append(temp)
}

//定义一个字典,用于统计每个类的对象个数
var dict = ["Person": 0, "Teacher": 0, "Student": 0]

for item in array {
    if item is Teacher {  //是否是Teacher类
        dict["Teacher"]! += 1
    } else if item is Student {  //是否是Student
        dict["Student"]! += 1
    } else {  //Person类
        dict["Person"]! += 1
    }
}

//输出字典值
for (key, value) in dict {
    print("\(key) has \(value) items")
}

//原始数组
print("------------------------------")
for item in array {
    print(item)
}

//根据age从大到小排序
print("------------------------------")
array.sort { return $0.age > $1.age}
for item in array {
    print(item)
}

//根据全名从前往后排序
print("------------------------------")
array.sort { return $0.fullName < $1.fullName}
for item in array {
    print(item)
}

//根据gender和age从大往小排序
print("------------------------------")
array.sort { return ($0.gender > $1.gender) && ($0.age > $1.age) }
for item in array {
    print(item)
}

//穷举,调用run方法和lendBook方法
print("------------------------------")
for item in array {
    item.run()
    if let teacher = item as? Teacher {
        teacher.lendBook()
    } else if let student = item as? Student {
        student.lendBook()
    }
}

最终执行的结果:




《Swift类的属性与方法》的链接:点我跳转

16、Swift类的特性与初始化详解 本文深入解析了 Swift 中类的特性与初始化机制。内容涵盖类相较于结构体和枚举的优势、子类与超类的关系、继承与重写机制、`super` 关键字的使用,以及类初始化器的规则,包括指定初始化器与便利初始化器的区别和执行流程。文章还探讨了可失败初始化器的限制、必需初始化器的作用,并通过示例代码帮助开发者避免常见错误。最终总结了类初始化规则的重要性,为构建结构清晰、功能丰富的 Swift 类提供了理论支持和实践指导。 阅读详情

相关推荐

16、Swift 类的继承、初始化与方法重写详解

本文详细解析了 Swift 中类的继承机制、初始化过程以及方法重写的规则。内容包括类与结构体在循环引用中的差异、子类与超类的关系、继承的实现、方法的重写与 super 关键字的使用、指定初始化器与便利初始化器的区别、子类初始化器的规则、可失败初始化器以及必需初始化器等。通过丰富的代码示例和流程图,帮助开发者深入理解 Swift 面向对象的核心机制,并提供了常见错误及实践建议,适用于希望掌握 Swift 类机制的中高级开发者。

eee77的博客 128

Swift中自定义类==比较方法未被调用的分析和解决

在项目中自定义了2个类:A和B,其中A含有B的实例变量. 在这2个类中都定义了==比较方法,按照正常来说:比较A,必然比较B.因为需要比较A中类型为B的实例变量. 但实际运行中发现,两个字面上完全一样的A实例对象,比较竟然不相等!!! 在A的==方法中下断点,发现3个问题: 比较不相等是因为其中B实例变量的比较不相等 B实例比较并没有调用B中的==比较方法 最为奇怪的是:在Xcode的lldb中...

享受开发,颠倒银河 980

01_MySQL下载、安装与配置(以MySQL8.0.31版本为例)

1.点击下载好的mysql安装包 进入到mysql installer界面。2.选择MySQL Servers选项 一直下拉。

4819

【转】Swift 中的面向协议编程:引言

简述Swift中的面向协议编程

专注于苹果IOS开发和最新资讯 633

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

不忘初心 方得始终 2980

ego-planner启动参数深度解析:从配置到实战避障应用

本文深入解析EGO-Planner启动参数的配置与实战应用,重点探讨无人机自主导航中的避障性能优化。通过环境感知、运动约束和算法控制三类参数的详细说明,结合ROS和RViz工具,提供从基础配置到高级调优的完整指南,帮助开发者提升无人机在复杂场景下的规划效率和安全性。

rum55的博客 246

Swift4.0 Codable踩坑之派生类数据的保存

本以为之前使用Codable的过程中踩的坑已经够多了,今天博主有遇到一个坑,调了一个下午才解决,问题不大,但是中文的技术文里都很少涉及这个问题。问题描述:遵循了Codable协议的自定义类,派生出的子类JSON化与反JSON化。简单来说,就是这儿有一个类遵循了Codable协议,其自身可以很方便地使用JSONEncoder和JSONDecoder来JSON化和反JSON化。但是子类就不是那么方便了。

麻豆_matou 6659

怀旧党必备!用iPhone4s重温iOS6的保姆级教程(含游戏资源包)

本文提供了一份详细的iPhone4s降级至iOS6.1.3的保姆级教程,包括设备准备、越狱操作、系统降级及资源优化全流程。通过自制固件和越狱工具,用户可以重温经典的拟物化设计和流畅体验,同时获取经典游戏资源包,打造复古游戏神器。

nft7creator的博客 880

[XML]学习笔记(六)——XML Schema复杂类型

六、 复杂类型: a) 复合元素:指包含其他元素和/或属性的XML元素。有四种复合元素:空元素、包含其他元素的元素、仅包含文本的元素、包含元素和文本的元素。 b) 复合空元素:如一个空的XML元素:,为了定义这种无内容的类型,必须声明一个一个在其内容中只能包含元素的类型。有下列几种方法: i. 带有复合内容的复合类型: #打算限定或者扩展某个复合类型的内容模型

CristianoJason的博客 5311

MATLAB Appdesigner开发独立桌面App全流程(一):以打开串口功能为例介绍Appdesigner的基本使用

本文详细介绍了Appdesigner的基本使用,以串口功能为例介绍按钮回调函数的实现以及控件之间通信的问题

Zhuwany的博客 3万+

SAP S4业务伙伴(BP)实战指南:从角色分配到数据同步的完整流程

本文详细解析了SAP S4业务伙伴(BP)功能,从基础概念到实战操作,涵盖角色分配、数据同步及常见问题排查。通过BP机制,企业可高效管理客户、供应商等多重身份,实现数据共享和动态切换,显著提升主数据管理效率。特别适合SAP实施顾问和ERP管理员参考。

y2z3a4b5c的博客 869

(作业)Swift类的属性与方法

话不多说,先贴作业要求 因为Person类需要一个枚举类型的gender,所以先定义枚举 //性别的枚举 enum Gender: Int { case male //男性 case female //女性 case unknow //未知 //重载>操作符,方便后面排序使用 static func >(lhs: Ge

麻豆_matou 3189

FM收音机调试-RDA5807M

收音机调试 IC型号:RDA5807M

mangofu的博客 6163

swift int转string_用Swift开发macOS程序, 三、Swift 的进阶

好吧,让我们从头来过。什么是对象编程编程呢?先让我们从上往下理解:人是一个喜欢归类的动物,所以有生物学上的纲目。纲,即是我们编程里的基类(也叫父类);目,即是我们编程里的派生类(也叫子类)。基类与派生类是相对而言的,但跟纲目一样,都是以相同特征、行为来划分的集合,同时派生类是基类特征、行为的延伸与拓展。特征在这里叫属性,行为在这里叫方法,这也是类的基本。另外,同生物学上的趋同进化一样,不同的类需要...

weixin_39774490的博客 286

[CSP-X2025山东小学组T4]勇者斗恶龙

[CSP-X2025山东小学组T4]勇者斗恶龙,动态规划

少儿编程乔老师 150

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

iOS开发之Swift标识符

在iOS开发中,使用Swift语言时,标识符是用来命名变量、常量、函数、类、结构体、枚举等程序实体的; 这些标识符使得Swift代码更加清晰、易于理解和维护。

Kevin写代码 1428

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Swift 协议详解:Equatable、Hashable、Identifiable、Comparable

Swift 是一个强类型的语言,它通过协议(Protocol)为类型提供功能扩展的强大能力。本篇文章将深入解析四个在开发中非常常见也非常重要的协议:Equatable、Hashable、Identifiable 和 Comparable。掌握它们不仅可以写出更简洁、更强大的代码,也能够更好地与 Swift 标准库(如数组、集合、字典等)进行交互。

郭永明的技术专栏 1016

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

告别冗余代码,Swift枚举让你的项目效率提升70%

掌握Swift枚举用法,告别冗余代码与复杂判断。适用于状态管理、网络请求处理等场景,通过关联值和模式匹配提升代码可读性与安全性。有效减少错误,提高开发效率,值得收藏。

AlgoChat的博客 338

[Swift]9.0swift语言中的面向对象特性

Swift语言中的面向对象特性

旗帜鲜明的支持鲜明旗帜 570

Swift3.0学习笔记-Extensions

Swift3.0 Extension

brycegao321的博客 1054

Swift实验(四)

编写代码,在实验四基础上,实现红色文字要求: 1)实现Person类,具有firstName, lastName,age,gender等存储属性,fullName计算属性,其中gender是枚举类型(male,female) 2)具有指定初始化器和便利初始化器,指定初始化器使用required关键字修饰; 3)Person具有work方法,输出“Person XXX is working” a1...

圣三一 1779

Swift 属性

Swift属性是编程中非常重要的一部分,它们用于存储、计算和监听数据。通过本文的介绍,相信你已经对Swift属性有了更深入的了解。在实际开发中,灵活运用属性可以使得代码更加清晰、易维护。

lly202406的博客 453

swift构造方法

class Human {                  var name:String?         var age:Int?                  //正常构造         init(name:String,age:Int){             self.name = name;             self.age  = age;

水清_木秀的博客 425

Swift学习笔记-面向对象

//1.Swift可以定义枚举,结构体,类,3种面向对象的类型,面向对象的两大核心是类和对象 //2.面向对象编程的3大特征,封装,继承(Swift使用协议弥补了单继承灵活性不足的缺点),多态 //3.C语言中结构体和枚举不具有面向对象的特征,Swift中多了结构体和枚举这两种程序单元 //1.枚举 //Swift的枚举不像c那么简单,是完全重新定义的类型,支持计算属性,实例方法,类型方法,支持定义

JiangJun 914

13、Swift中的Codable

13、Swift中的JSON解析1.1 Codable简介1.2 Codable的痛点1.3 Codable的简单使用1.4 json中的key和模型中的Key不对应1.4.1、实现CodingKey协议进行枚举映射1.4.2 keyDecodingStrategy1.5 使用嵌套的JSON对象1.6 处理Sex1.7 处理数组 1.1 Codable简介 Codable 是 Swift 4.0 以后推出的一个编解码协议,可以配合 JSONDecoder 和 JSONEncoder 用来进行 JSON 解

重楼的博客 1983
上一篇: (作业)Swift闭包、扩展、泛型
下一篇: 中国天气网免费天气API
麻豆_matou
博客等级 码龄10年 41粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值