Swift3.0 - 探究Self的用途

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

本文主要是介绍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

相关文章

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

探究零工市场小程序如何改变传统兼职模式

近年来,零工市场小程序正逐渐改变传统的兼职模式,为求职者和雇主提供了一个更为高效、便捷的平台。本文将深入探讨零工市场小程序如何影响传统兼职模式,以及它带来的优势和挑战。 一、背景与挑战 传统的兼职市场往往存在信息不对称的问题,求职者难以快速找到合适的工作,而雇主也难以找到匹配的劳动力。此外,兼职工作的不稳定性和安全性也是求职者关注的焦点。零工市场小程序的兴起,旨在解决这些问题,通过数字化手

apk中签名文件探究(*.SF, *.MF,*.RSA)

文章来源: 作者:嘟嘟小灰 链接:https://www.jianshu.com/p/e07da93acf98 来源:简书 1、取一个apk,然后进行不同签名,生成1.apk、2.apk,并提取META-INF里面的文件进行比对 def calc_sha1(data):sha1obj = hashlib.sha1()if not isinstance(data, (bytear

TRIZ在充电桩安全中的应用探究

在当今电动汽车日益普及的时代,充电桩的安全问题至关重要。TRIZ(发明问题解决理论)可以为提升充电桩的安全性提供强大助力。具体步骤如深圳天行健企业管理咨询公司下文所述: 一、充电桩安全面临的问题 1.电气安全风险:包括过压、过流、短路等电气故障,可能导致设备损坏、火灾甚至人员伤亡。 2.机械安全风险:如充电桩外壳的坚固程度、充电插头的插拔可靠性等,可能影响用户的使用安全。 3.环境安全

Flink on YARN模式下TaskManager的内存分配探究

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 我们使用如下的参数提交了Flink on YARN作业(per-job模式)。 /opt/flink-1.9.0/bin/flink run \--detached \--jobmanager yarn-cluster \--yarnname "x.y.z" \--yarnjobManagerMemory 2048 \--

BBR 与 AIMD 共存公平性探究

一个古已有之的结论: deep buffer 场景,bbr 相对 reno/cubic 等 aimd 有优势,侵占性强;shallow buffer 场景,aimd 有优势,bbr 带宽被挤占。 本文用实例分析 why 并给出 how。 先看 deep buffer 场景 bbr 单挑 aimd 双流的效果,下图是标准 bbr,被虐成经理: 下图是用 max(bw/delay) 替代 ma

[LeetCode] 238. Product of Array Except Self

题:https://leetcode.com/problems/product-of-array-except-self/description/ 题目 Given an array nums of n integers where n > 1, return an array output such that output[i] is equal to the product of all

深入Linux轻量级进程管理:线程创建、线程ID解析与进程地址空间页表探究

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 `🚲Linux线程控制``🐏POSIX线程库``🐕创建线程``🐟指令查看轻量级进程``指令:ps -aL` `🐒线程ID及进程地址空间布局`*pthread_t 到底是什么类型呢?* `🦔__thread与线程的局部存储`

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究 文章目录 「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究前言介绍UIResponderUIGestureRecognizerUIControl 正文UIGestureRecognizer和