ios教程-第一课 技术实现

学习的方法

步骤上的方法:
看+实践题目操作+分享(将学到的再社交媒体分享出去)。

时间上的方法:
连续学习,不要中断式学习(三天打鱼两天晒网,隔几天就把之前学的都忘记了,增加了返工的成本)。

playground

新建xcode的时候有类型叫playground,他是一种沙箱环境,就是用来学习swift语言实时看效果用的。

import Cocoa // 引入库,估计print就是这里面的(但我发现删掉cocoa也能print)
var greeting = "Hello, playground" // 声明变量。
print("hello world" + greeting) // 打印

基本语法

var声明的是变量。一旦声明后,这个变量类型就确定了,不能像js一样后期再赋值别的类型(所以他有点像TS)。
let声明的是常量,不能改。

分号可以有可以没有,像js一样。

类型原则

  • swift用struct结构体实现各种你看到的Int、String等,结构体如何调用方法呢?他编译时候直接编译成了对应函数调用。于是他用这个技术,把栈上的基本类型和堆类型给统一了,既有性能又有方法能力。 跟java 的装箱类型(真堆类型)有本质区别。

  • 多态。多个子类继承自同一个父类,然后一个变量指向父类,就可以调用这个父类下的统一的一个方法,但实际是执行特定变量所代表的子类对象的该方法的实现(ts/js里面是鸭子类型,只要形状相同咱就可以把父类变量指向任何其子类,毕竟形状肯定满足吧)。

  • 函数对外入参名,例如:number.isMultiple(of: 3),这玩意就是number这个变量结构体上的isMultiple方法,然后他接受一个入参叫做of。

  • 可变参数
    答案其实极其黑色幽默:因为 Swift 有“外部参数标签”这个护身符,而 JS/TS 纯靠“ naked(光秃秃)”的传参顺序。
    Swift: 传参自带“GPS导航(标签)”,所以可变参数可以放任意位置,只要后面的参数带着标签,编译器就绝对不会迷路。

    
    // 假设的 JS 语法(实际上会报错:Rest parameter must be last)
    function fakePrint(...items, separator) { ... }

// 当你调用它时:
print("a", "b", "c", separator: "-")


// 之所以能写abc然后让他收集到items里面,就是因为后面第二个参数separator人家要求外部必须传递参数名,于是外部调用的时候编译器肯定能把abc收集到items里面

### 字符串与类型

var a = "abcd"。 分号必须用双引号。

属性:a.count获取长度。
方法:

* a.upperCased()转大写。
* hasSuffix是否以xxx结尾。

字符串的拼接:"hello" + a

字符串的转换:String(a)

字符串插值:\( ) 的方式,它不仅可以放变量,甚至可以在里面写简单的表达式,比如 print("结果是: \(1 + 1)")。 类似js的`helo ${a}`

多行字符串:
```js
let movie = """
A day in
the life of an
Apple engineer
"""

数字

let number = 120
print(number.isMultiple(of: 3))

这就是数字整型所带的方法。判断一个数是另外一个数的多少倍。

面向对象

Swift 官方的至高设计哲学: 能用 struct 就绝不用 class。你在 iOS 开发里见到的基础类型(Int, String, Array, Dictionary)全都是 struct。只有当你确实需要“继承”或者需要“多个地方共享同一个指针实例”时,才用 class。
class能干的,struct都能干。

protocol。它在语法地位上等同于 Java 的 interface。
它自己不能被实例化(你不能 let p = MyProtocol()),它只负责列出一张“清单”,规定遵守它的人必须长什么样:

抽象类。
如果一个抽象类里没有任何具体声明的实现那他就是纯抽象类(Pure Abstract Class)”,纯抽象类其实跟接口功能一样了。只是类和接口在概念上是俩不同的功能概念,类主要讲究我是谁,接口主要讲究我要实现什么。
Swift 彻底取消了 abstract class(抽象类)的概念,那如果我想写一个“半成品”,既有规矩,又有默认实现的保底方案,该怎么办?
传统语言靠抽象类,而 Swift 靠“协议扩展(Protocol Extension)”。
正因为“全空抽象类”和“接口”在历史上的这种重叠引发了无数新手的混乱,更年轻的现代语言在设计时直接出手整顿了:
C++(老大哥): “我早就看穿了。所以我压根没设计 interface 关键字。在 C++ 里,你想用接口,直接写一个全空虚函数的 class 就行了,反正 C++ 支持多继承,没这顾虑!”
Swift(新一代): “我觉得‘抽象类’这个概念太别扭了,容易引导人写出臃肿的继承树。所以我直接把抽象类干掉了!在 Swift 里,你要定纯规范就用 protocol(接口),你要加默认实现就用 protocol + extension,彻底跟单继承的 class 划清界限!”

子类能不能不实现父类的东西:

  1. 父类如果有默认实现则可以不实现。例如java里default实现以及swift里extends语法给protocol接口增加方法实现。
  2. 如果父类或接口只有声明,但没有具体实现,那么子类通常来说必须得实现。但是如果你正在写的也是个抽象类,那么你就可以继续不实现咯。

多重继承:
Swift 的 class 严格限制单继承,而 struct 压根不支持类继承。
所以,Swift 里的“多重继承”,实际上指的是“一个 struct 拥有同时遵守多个协议(接口)的能力”。这也就是现代软件工程里大名鼎鼎的“多实现”。


john 发布于  2026-6-6 13:06 

chrome占用cpu过高的解决 技术实现

首先,如何发现是chrome导致的cpu过热和风扇启动呢。 我们可以去mac的活动监视器里去看,按cpu倒序。 也可以去360这样的安全管家软件了去看: 之后我们去分析chrome里面到底哪里有问题: chrome其实也有任务管理器可以打开: 我当时会发现上面任务管理器有一个占用超过100% cpu的进程是某个插件,于是我搜索任务管理器里面的插件id。 就这...


john 发布于  2026-4-12 02:51 

react源码解密8-fiber架构 技术实现

fiber架构的由来 以前咱们实现的react源码,他初始mount和二次update都是一个递归的树的渲染过程。这个任务消耗其实不小,对于单线程的js来说很容易可能就卡住主线程了。 如果用requestIdleCallback来空闲时间执行: 他无法区分任务优先级。因为并不是所有渲染都是低优先级的。可能也有一些要赶紧执行render的东西。 mount和u...


john 发布于  2026-4-5 23:52 

react源码解密7-hooks 技术实现

介绍

react16.8里面增加了hooks


john 发布于  2026-4-5 22:40 

react源码解密6-渲染性能优化 技术实现

前置准备 jsx我们应该叫他什么。他本质上是createElement( div 或MyApp, props, xxxx), 我觉得他返回的应该叫组件树或elements树吧(这个树里既有div类型的节点,又有MyApp函数式组件类型的节点) 实际render的时候,才会执行上述elements树里面的组件函数或class,从而拿到每个element节点的...


john 发布于  2026-4-5 22:02 

john 发布于  2026-4-5 21:12 

react源码解密4-实现组件 技术实现

elements和Component概念 上一节我们主入口render的时候,你会发现我们render的本质是React.createElement: // ReactDOM.render( div class= page-wrap hello myreact render to dom /div ) React.createElement(div, { ...


john 发布于  2026-4-4 14:04 

react源码解密3-实现初始化渲染

dom和虚拟dom 真实dom是前端必修课,她是浏览器内提供的一套底层文档对象模型,从而让你渲染浏览器内的内容以及操控浏览器内的内容。 如果从技术本质上来看,她其实应该是浏览器这个软件本身底层 c++所实现的渲染之上的一层逻辑抽象。用一种dom这样的数据结构来管理浏览器画布里绘制的东西。 再从技术层面往上层看,c++的dom模型系统为了能被开发者调用,她暴露...


john 发布于  2026-4-4 00:02 

react源码解密2-先学会应用

官方脚手架区别 目前官方版本是react19.https://react.dev/learn/creating-a-react-app learn文档左侧有: create a react app。 这个是直接用现成的框架,即携带了路由、请求库等的完整框架。例如next.js。 因为react是一个库并不是框架,所以这些next.js框架就给你把其他配套加上...


john 发布于  2026-4-3 09:55 

react源码解密1-思路介绍 技术实现

本教程以react18为例。 源码学什么 核心原理 组件生命周期 虚拟dom实现 diff算法 组件渲染与更新 hooks机制 事件与状态管理 事件代理机制 自定义事件系统 setState工作原理 状态更新处理 props与state react架构 fiber系统 cocurrent模式 lane模型 调度系统 时间切片 react功能简介 传统的前端开...


john 发布于  2026-4-2 22:13