一. 什么是链式?可以连续不断地进⾏方法调⽤用的一种语法形式。
二. 探究链式的使用与实现本质示例 1:打豆豆
有位科学家到了南极,碰到一群企鹅。他问其中一个:“你每天都干什么呀?”那企鹅说:“吃饭睡觉打豆豆。”他又问另一个:“你每天都干什么呀?”那企鹅也源说:“吃饭睡觉打豆豆。”他问了许多许多的企鹅,都说:“吃饭睡觉打豆豆。”后来他碰到了一只小企鹅,很可爱的样子,就问它:“小朋友,你每天都干什么呀?”小企鹅说:“吃饭睡觉。”科学家一愣,随即问到:“你怎么不打豆豆呀?”小企鹅委屈的说:“因为我就是豆豆。”
思考一下如何用代码表述这些企鹅每天都做了什么 ❓
普通的实现方式
// 其他企鹅的一天let otherPenguin = Penguin()otherPenguin.eat()otherPenguin.sleep()otherPenguin.strike(penguin: "豆豆")print(otherPenguin.description)// ->吃饭->睡觉->打豆豆
使用链式实现
let longDay = Penguin.sta ...
理解泛型
泛型的定义在 Swift 语言中,泛型是一种编程技术,它允许你编写灵活、可重用的函数和类型,可以工作于任何类型。泛型的主要好处是它可以帮助你避免重复代码,并用一种清晰和抽象的方式来表达代码的意图。泛型的占位类型,可以是 T,也可以是 U,完全由您决定,使用一个由含义的占位符,更能表达含义。例如:系统对数组的定义 struct Array<Element>。
在某场技术活动中,需要管理会场中的观众,每人必须观看两个小时才可以离场(先进先出,无法提前离场)。
会场分为三个会场,分别有以下要求:
主会场 A:有入场号可以进
分会场 B:使用姓名就可以进
女性会场 C: 有号码的女性可以进
在主会场 A 中,由于准备充分,每个入场的观众发放参会证,使用参会证上的号码入场。
使用 Stack 管理观众的入场和离场。Stack 通过 push 方法记录入场的用户号码,通过 pop 方法移除离场的用户。
struct Stack { var items = [Int]() mutating func push(_ item: Int) { ...
Swift 的函数式编程是一种编程范式,它强调使用函数来处理数据和表达程序逻辑。Swift 的函数式编程核心思想是使用一等函数(first-class functions)和不可变性(immutability)来编写代码,这样可以更容易地推理和测试。函数式编程鼓励使用纯函数(输入完全决定输出,无副作用)和高阶函数(可以接受其他函数作为参数或返回函数的函数)。
let numbers = [1, 2, 3, 4, 5] // 使用 map 函数将每个数字乘以 2 let doubledNumbers = numbers.map { $0 * 2 } // 使用 filter 函数筛选出偶数 let evenNumbers = numbers.filter { $0 % 2 == 0 } // 使用 reduce 函数计算所有数字的总和 let sumOfNumbers = numbers.reduce(0, +) print(doubledNumbers) // 输出 [2, 4, 6, 8, 10] print(evenNumb ...
面向协议编程
你可能听过类似的概念:面向对象编程、函数式编程、泛型编程,再加上苹果新提出的面向协议编程,这些统统可以理解为是一种编程范式。所谓编程范式,是隐藏在编程语言背后的思想,代表着语言的作者想要用怎样的方式去解决怎样的问题。不同的编程范式反应在现实世界中,就是不同的编程语言适用于不同的领域和环境,比如在面向对象编程思想中,开发者用对象来描述万事万物并试图用对象来解决所有可能的问题。编程范式都有其各自的偏好和使用限制,所以越来越多的现代编程语言开始支持多范式,使语言自身更强壮也更具适用性。面向协议编程是在面向对象编程基础上演变而来,将程序设计过程中遇到的数据类型的抽取(抽象)由使用基类进行抽取改为使用协议进行抽取。更简单点举个例子来说,一个猫类、一个狗类,我们很容易想到抽取一个描述动物的基类,这就是面向对象编程。当然也会有人想到抽取一个动物通用的协议,这就是面向协议编程了。而在 Swift 语言中,协议被赋予了更多的功能和更广阔的使用空间,为协议增加了扩展功能,使其能够胜任绝大多数情况下数据类型的抽象,所以苹果开始声称 Swift 是一门支持面向协议编程的语言。
协议基础
官方 ...
在 iOS 中,只有继承了 UIResponder(响应者)类的对象才能接收并处理事件。其公共子类包括 UIView、UIViewController 和 UIApplication 。UIResponder 类中提供了以下 4 个对象方法来处理触摸事件:
/// 触摸开始override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {}/// 触摸移动override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {}/// 触摸取消(在触摸结束之前)/// 某个系统事件(例如电话呼入)会打断触摸过程override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {}/// 触摸结束override func touchesEnde ...
1.最炫酷的 AI 工具 - LUMA
描述: 一个计算机视觉和图像处理工具库。它提供了先进的图像处理算法和模型,如物体检测、图像分割、图像增强等。Luma Labs 具有高性能的图像处理能力,可以灵活集成到现有应用程序中,为大家提供丰富的图像处理功能。
官方链接:LUMA AI
2.看起来最有用的 AI 工具 - Gamma
描述: 使用这款强大的 AI 生成器,创建一个工作演示文稿、文档或网页,您可以在不到一分钟的时间内进行改进和定制。
官方链接: Gamma
3.最好用的 AI 搜索引擎 - Phind
描述: 一个无需注册的 AI 搜索引擎,让你轻松解决编程问题!
官方链接: Phind
4.最有潜力的 AI - vall-e-x
描述: 仅需 3 秒音频实现声音克隆!
官方链接: vall-e-x
5.最好用的 AI 学习工具 - Albus
描述: 一种与 AI 技术互动的全新方式。Albus 可以分解主题、创建见解、生成图像和音频。
官方链接: Albus
6.使用最多的 AI 工具 - Raycast AI
描述: 想取代 Spotlight 的「野心工具」
...
1. 拦截的价值
计算机科学领域的任何问题都可以通过增加一个中间层来解决。 —— Butler Lampson
如果系统的控制权、代码完全被掌控,很容易添加中间层;现实情况我们往往无法控制系统的所有细节,所以需要使用一些 “非常规”(拦截) 手段来增加中间层。
2. 拦截的方法2.1 拦截/覆写 浏览器 API最常见的场景有通过拦截 console 实现错误上报。
const _error = console.errorconsole.error = (...args) => { _error.apply(console, args) console.info('在此处上报错误信息...')}// 其它代码打印错误console.error('error message')
项目中通常会基于 axios 此类的网络库,做一些统一处理逻辑但在某些场景,我们无法修改项目代码,就能通过拦截 fetch, xhr 来达到目的。
// 接口性能监控,打开 https://example.com/, 在控制台执行以 ...
1. 理性的崛起
苏格拉底喜欢问别人问题,然后被判死刑了。
柏拉图是苏格拉底的学生,亚里士多德在柏拉图学院学习过,后来他成了马其顿王子亚历山大的老师,亚历山大征服了希腊,乃至东欧、北非、中亚。
后来罗马帝国取代了亚历山大帝国,但是他们同样试行包容政策,这样希腊哲学得到了流传。文化的多元性促使欧洲成为一个多民族国家,这点秦始皇做的恰好相反。
保罗是身在罗马的犹太人,他从犹太教转投基督教,帮助基督教进行传教,但是他宽容的传教行为遭到了原基督教的抵制,
哲学早期是为基督教做宣传的,但是本质上是相悖的,哲学要求怀疑,宗教要求信仰。
“能用钱解决的问题都是不是问题。” “必须用暴力解决的问题都是解决不了的问题。” 这两句话都是有适用范围的,后者可以阐述阶级上层对低层的处理方式。
基督教传播越来越广,威胁到了罗马的统治,也遭到了罗马法律的制裁。原因就是当时基督教的教义讲究,单一信仰,反暴力,人人平等。
君士坦丁当上了罗马皇帝,发布了《米兰赦令》,鼓励了基督教的发展。基督教也成了罗马的国教。
哲学家们成了基督教所称的“异教徒”中的一员。基督教徒们毁掉了大量和教义不符的书籍,希腊哲学几 ...
为什么要做性能优化?性能优化到底有多重要? 网站的性能优化对于用户的留存率、转化率有很大的影响,所以对于前端开发来说 性能优化能力 也是重要的考察点。性能优化的点非常的多,有的小伙伴觉得记起来非常的麻烦,所以这里主要梳理出一条线来帮助记忆。可以将性能优化分为两个大的分类:
加载时优化
运行时优化
加载时性能
顾名思义 加载时优化 主要解决的就是让一个网站加载过程更快,比如压缩文件大小、使用 CDN 加速等方式可以优化加载性能。检查加载性能的指标一般看:白屏时间和首屏时间:
白屏时间:指的是从输入网址, 到页面开始显示内容的时间。
首屏时间:指从输入网址, 到首屏页面内容渲染完毕的时间。
1.1 白屏时间计算
将代码脚本放在 前面就能获取白屏时间:
<script>new Date().getTime() - performance.timing.navigationStart</script>
1.2 首屏时间计算
在 window.onload 事件中执行以下代码,可以获取首屏时间:
new Date().getTime() - perfo ...
下面是一些用 css 做出的效果,挺有意思,记录一下。
1. 发散特效
<div class="loader rainbow"> <div class="circle" style="--i: 1"></div> <div class="circle" style="--i: 2"></div> <div class="circle" style="--i: 3"></div> <div class="circle" style="--i: 4"></div> <div class="circle" style="--i: 5"></div> <div class="circle" style=&quo ...