Swift3.0 - 探究Self的用途

2024-06-11 01:32
文章标签 swift3.0 self 探究

本文主要是介绍Swift3.0 - 探究Self的用途,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Swift3.0 - 真的很简单
Swift3.0 - 数据类型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可选值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 对象和类
Swift3.0 - 属性
Swift3.0 - 函数和闭包
Swift3.0 - 初始化和释放
Swift3.0 - 协议protocol
Swift3.0 - 类和结构体的区别
Swift3.0 - 枚举
Swift3.0 - 扩展
Swift3.0 - 下标
Swift3.0 - 泛型
Swift3.0 - 异常错误
Swift3.0 - 断言
Swift3.0 - 自动引用计数(strong,weak,unowned)
Swift3.0 - 检测API
Swift3.0 - 对象的标识
Swift3.0 - 注释
Swift3.0 - 元类型
Swift3.0 - 空间命名
Swift3.0 - 对象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 类簇
Swift3.0 - 动态调用对象(实例)方法
Swift3.0 - 文本输出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 镜像
Swift3.0 - 遇到的坑

  • 如何实现对象拷贝

第一种方法:

1.遵守协议 NSCopying
2.实现协议

NSCopying 协议

public protocol NSCopying {public func copy(with zone: NSZone? = nil) -> Any
}

示例代码:

class Student:NSCopying {var name: Stringrequired init(name:String){self.name = name}func copy(with zone: NSZone? = nil) -> Any {let student = Student(name: self.name)return student}
}// 使用let student1 = Student(name: "XUJIE")
let student2:Student = student1.copy() as! Student
student2.name = "酷走天涯"
print(student1.name)
print(student2.name)

运行:

XUJIE
酷走天涯

分析:

由于NSCopying 协议里面的方法copy 返回的值为Any 系统没法推断出来是Student 类型,所以必须 as! 指明是Student 类型 过程有点繁琐

  • 第二种方法

1.创建一个一个required 修饰的初始化方法
2.自定义一个copy方法

示例代码

class Student{var name: Stringrequired init(name:String){self.name = name}func copy() -> Self {let result = type(of: self).init(name:self.name)return result}
}
// 使用
let student1 = Student(name: "XUJIE")
let student2 = student1.copy()
student2.name = "酷走天涯"
print(student1.name)
print(student2.name)

运行结果:

XUJIE
酷走天涯

分析:

type(of: self) 获取到自身类的类型,然后通过init(name:self.name) 初始化一个对象 ,初始化的对象为Self 类型

思考:初始化为什么要使用required 修饰的的初始化

参考元类型

设计规范:

像拷贝这种行为, 不是很多对象都具有的行为,我们应该把它设计成协议,让类去继承它

protocol Copy{func copy() -> Self
}

其实如果我们但从技术上实现, 下面的方式也可以的

    func copy() -> Student{let result = Student.self.init(name:self.name)return result} func copy() -> Student{let result = Student.init(name: self.name)return result}func copy() -> Student{let result = Student(name: self.name)return result}
  • 给多个对象扩展相同的方法

需求: 给数字扩展一个返回平方的操作

// 定义个协议
protocol NumberProtocol{
}
// 扩展实现协议
extension Int:NumberProtocol{
}
extension Double:NumberProtocol{
}
// 给协议扩展方法
extension NumberProtocol{
// 我们不确定返回的Self 到底是什么类型
func squareValue()-> Self{
if self is Int{let n = self as! Intreturn n * n as! Self
}
if self is Double{let n = self as! Doublereturn n * n as! Self
}
return 0 as! Self
}
}
print(3.44.squareValue())
print(3.squareValue())

如果您有更多思路,请交流探讨。

这篇关于Swift3.0 - 探究Self的用途的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049839

相关文章

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

LLM agentic模式之reflection:SELF-REFINE、Reflexion、CRITIC

SELF-REFINE SELF-REFINE出自2023年3月的论文《Self-Refine: Iterative Refinement with Self-Feedback》,考虑到LLM第一次生成结果可能不是最好的输出,提出一种包括反馈(feedback)和改善(refinement)两个步骤的迭代方法来改进LLM的初始输出。 基本思路 对于输入,SELF-REFINE让LLM生成一个

“序列优化探究:最长上升子序列的算法发现与应用“

最长上升子序列 最长上升子序列是指在一个给定序列中,找到一个最长的子序列,使得子序列中的元素单调递增。例如,序列 [1, 3, 5, 4, 7] 的最长上升子序列是 [1, 3, 5, 7],长度为4。 这是一个经典的动态规划问题。 假设dp[i]表示以第i个元素为结尾的最长上升子序列的长度。 可以用一个嵌套循环来遍历所有的元素对,如果前一个元素小于后一个元素,则可以将后一个元素添加到

【Deep Learning】Self-Supervised Learning:自监督学习

自监督学习 本文基于清华大学《深度学习》第12节《Beyond Supervised Learning》的内容撰写,既是课堂笔记,亦是作者的一些理解。 在深度学习领域,传统的监督学习(Supervised Learning)的形式是给你输入 x x x和标签 y y y,你需要训练一个基于参数 θ \theta θ的神经网络 f θ ( x ) f_\theta(x) fθ​(x)使其能

MCT Self-Refine:创新集成蒙特卡洛树搜索 (MCTS)提高复杂数学推理任务的性能,超GPT4,使用 LLaMa-3 8B 进行自我优化

📜 文献卡 题目: Accessing GPT-4 level Mathematical Olympiad Solutions via Monte Carlo Tree Self-refine with LLaMa-3 8B作者: Di Zhang; Xiaoshui Huang; Dongzhan Zhou; Yuqiang Li; Wanli OuyangDOI: 10.48550/a

CVPR2023论文速览自监督Self-Supervised相关38篇

Paper1 Self-Supervised Video Forensics by Audio-Visual Anomaly Detection 摘要原文: Manipulated videos often contain subtle inconsistencies between their visual and audio signals. We propose a video foren

【Redis实战专题】「技术提升系列」夯实基础分析探究List列表的点点滴滴

夯实基础分析探究List列表的点点滴滴 List列表介绍队列和堆栈场景常用操作指令llen获取链表的长度llen指令的案例介绍添加购物车信息获取用户数购物车数量 lindex获取指定位置的元素lindex指令的案例介绍获取第三个位置的购物车数据 lrange获取链表子元素列表下标的选择lrange指令的案例介绍 lset修改指定位置元素lset指令的案例介绍 linsert对链表的某个值

oc学习笔记1——self,super

self: self和java中的this,比较类似,但oc中的self比java中的this要强大。 1.self在对象方法(以-(减号)开头的方法)中,表示当前的实例对象。 2.self在类方法(以+(加号)开头的方法中),表示当前类 super: 调用当前方法的父类方法(类方法或对象方法), 使用的场景:子类只是想覆盖父类中的某个方法,并且只是对父类方法的拓展,在父类

深入探究RTOS的IPC机制----邮箱

阅读引言: 因为将来工作需要, 最近在深入学习OS的内部机制,我把我觉得重要的、核心的东西分享出来, 希望对有需要的人有所帮助, 阅读此文需要读友有RTOS基础, 以及一些操作系统的基础知识, 学习过Linux的最佳, 特别是想RT-Thread适合Linux非常像的, 代码风格、IPC机制等等。 目录 一、RT-Thread中邮箱的特性 二、 邮箱的源码实现 1,邮箱

Advanced RAG 08:使用 Self-RAG 打造高质量、可追溯的 RAG System

编者按: RAG 技术通过检索并利用外部知识源,能够较为有效地提升生成内容的准确性和多样性。然而,经典 RAG 流程也存在一些不足,例如不必要的检索会浪费计算资源,并可能引入无关内容或错误信息,影响生成质量。 本文介绍了 Self-RAG 这一技术,通过引入 Reflection Tokens,语言模型能够根据具体需求动态决定是否检索外部知识,从而大大减少了不必要的检索操作。与此同时,Self-