Archive
A journey through everything I've published, organized over time.
在 C 语言中, 常被翻译为“联合”或者“联合体”。它和 一样都可以声明多个成员,但两者的内存模型并不相同。 的关键不在于“同时拥有多个成员”,而在于多个成员共用同一块内存。
对于已经有静态类型语言经验的开发者来说,学习 TypeScript 的难点通常不在基础语法,而在于类型系统视角的切换。真正决定上手速度的,往往不是记住多少语法点,而是有没有先建立起正确的理解框架。
前五篇一直沿着同一条主线推进:先把任务说清楚,再让输出更稳定,再定义输入输出接口,再把复杂任务拆成流程,最后开始从工具和上下文的角度理解系统。继续往下,会遇到另一个容易被低估的问题:一个 Prompt 即使已经能跑通,也不代表它真的可上线、可维护、可长期使用。
前三篇分别在解决三个问题:第一,怎么把任务说清楚;第二,怎么让结果更稳定;第三,怎么把行为边界和输出契约定义清楚。继续往下,会遇到第四个问题:如果任务本身就不是单步能完成的,那么一个 Prompt 写得再完整,是不是仍然不够?
前两篇分别讨论了两件事:第一,Prompt 不是聊天技巧,而是结构化输入设计;第二,想让模型真正接入系统,就必须让输出更稳定。继续往下,会遇到第三个问题:如果目标不只是“答得差不多”,而是“行为边界清楚、输出结构稳定、结果能被程序消费”,Prompt 还需要向什么方向推进?
上一篇的核心结论是:Prompt 不是聊天技巧,而是结构化输入设计。这个视角解决了“怎样把任务说清楚”的问题,但当模型真正接入系统之后,还会遇到第二个问题:任务已经说明清楚,输出为什么仍然不稳定?
如果把大语言模型当成一个聊天对象,Prompt 的学习方向就很容易偏向“怎么说更像咒语”,而忽略“怎么让结果更稳定、更可控”。在 AI 应用开发场景里,Prompt 更适合被理解为一种接口设计能力,也可以把它视为一种写给模型的接口协议。
队列(Queue)是一种遵循先进先出(FIFO,First In First Out)原则的线性数据结构。在 iOS 开发中,我们经常需要使用队列来处理各种场景,比如:任务调度、消息队列、事件处理等。
MMap(Memory Mapping)是一种内存映射技术,它允许将文件或其他对象映射到进程的地址空间。在 iOS 开发中,mmap 是一个强大的系统调用,能够将磁盘文件的内容直接映射到内存地址空间,使得对文件的读写操作可以像访问内存一样简单高效。
循环数组(Circular Array),也称为环形数组或环形缓冲区(Ring Buffer),是一种特殊的数组结构。它在逻辑上将数组的首尾相连,形成一个环形结构。当数组索引到达末尾时,会自动回到数组的开头,实现循环访问。
给你一个链表,删除链表的倒数第 个结点,并且返回链表的头结点。 - 链表中结点的数目为 - - - 进阶:你能尝试使用一趟扫描实现吗?
给你一个整数 ,如果 是一个回文整数,返回 ;否则,返回 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
给定一个字符串 ,请你找出其中不含有重复字符的 最长 子串 的长度。 - - 由英文字母、数字、符号和空格组成
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。
在讲解数据结构时,数组总是一个大家早期接触的主题。但你可能会发现,不同编程语言中“数组”这一概念的使用方式和 API 有所区别。其实我们可以把「数组」分为两大类:
给定一个整数数组 和一个整数目标值 ,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
在 iOS 开发中,自动化构建和打包流程是提高效率的关键。Fastlane 的 Gym 工具为我们提供了强大的自动化能力,但有时也会带来一些令人头疼的问题。今天,我们就来探讨一个我遇到的 Gym 打包问题,并分享一个巧妙的解决方案。
在 iOS 开发中,证书管理一直是一个重要且复杂的话题。随着 fastlane 的更新,我们处理证书信息的方式也在不断演进。今天,我想分享我在使用 fastlane 读取和加密 iOS 证书信息时的经历,以及如何应对 fastlane 更新带来的变化。
JavaScript 程序的另一项基本操作是处理网页或服务器端的文本数据。 像其它语言里一样,我们使用表示文本数据类型。 和 JavaScript 一样,可以使用双引号()或单引号()表示字符串。
当用户浏览、退出和返回到您的应用时,应用中的 实例会在其生命周期的不同状态间转换。 类会提供许多回调,这些回调会让 Activity 知晓某个状态已经更改:系统正在创建、停止或恢复某个 Activity,或者正在销毁该 Activity 所在的进程。
一直自动登录导致忘记 gitlab 的密码,这篇文章我们来通过命令行修改 gitlab 的密码。
Git 是一款分布式版本控制系统,于 2005 年由 Linus Torvalds 创造并开源发布。Git 的设计初衷是为了更好地管理 Linux 内核代码,它的分布式特性使得多人协作开发和大型项目的版本控制变得更加高效和可靠。现在,Git 已经成为了开源社区和软件开发领域中最受欢迎的版本控制工具之一。
C 语言能让程序员恰到好处的控制程序,这是它的优势之一。程序员通过 C 的内存管理系统指定变量的作用域和生命周期,实现对程序的控制。合理使用内存存储数据是设计程序的一个要点。
在一款 App 从开发到上架都会经历 的过程。其中编译打包这种重复且繁琐的工作公司内都会有一个 CI 平台去负责,我们今天就来了解一下 CI 的编译打包流程是怎样的。
* macOS Ventura 13.3 * Xcode 14.3 * Apple M2 Pro 如果环境大体相同可用我已整理好的工程:objc4-866.9 源码编译
首先保证硬盘空间足够,本人一套流程下来文件夹有将近 60GB 大小。接下来是相关环境的安装,因为我的环境都是最新的,所以基本安装的都是最新版的包,如果你的环境不是新版的话,请找对应版本包安装。本人环境说明:
ProvisionQL 是一款支持快速预览 和 等文件信息的插件。它能以美观整洁的页面快速预览大量信息,包括设备 UUID、证书、授权等等。
之前的文章介绍过,字符串是以空字符( )结尾的类型数组。常用的输出字符串的方式有两种 和,他们不同之处在于,是格式化输出字符串,而只显示字符串。
macOS 上的 Ruby 环境管理我相信是大多数软件开发都会遇到的一个问题,如果我们需要同时管理多个 Ruby 版本的话,有 和 的方式,具体的操作网上已有大量的文章供我们学习,本文不再做赘述。今天我们来看一下如何使用 来管理我们的 Ruby。
由于网络问题,我们在使用 Xcode SPM 管理项目依赖库的时候,依赖库那速度真的是拉的一泻千里💩。所以我们需要将 SPM 下载依赖库的过程交给我们的代理去处理。首先你需要一个科学上网工具,无论是客户端还是路由器刷机,此文章的例子都是基于本人网络环境 ,其他的代理方式需自行研究。
指针?什么是指针?从根本上看,指针(pointer)是一个值为内存地址的变量(或数据对象)。正如类型变量的值是字符,类型变量的值是整数,指针变量的值是地址。在 C 语言中,指针有许多用法。本章将介绍如何把指针作为函数参数使用,以及为何要这样用。
C 有一系列专门处理字符的函数, 头文件包含了这些函数的原型。这些函数接受一个字符作为参数,如果该字符属于某特殊的类别,就返回一个非零值(真);否则,返回口(假)。例如,如果 函数的参数是一个字母,则返回一个非零值。
在 C 语言中,一直用 类型的变量表示 值。C99 专门针对这种类型的变量新增了 类型。该类型是以英国数学家 George Boole 的名字命名的,他开发了用代数表示逻辑和解决逻辑问题。在编程中,表示真或假的变量被称为布尔变量(Boolean variable),所以日 是 C 语言中布尔变量的类型名。 类型的变量只能储存 或 。如果把其他非零数值赋给 类型的变量,该变量会被设置为
暂无摘要
C 编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。 典型的 C 实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C 使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外
我想在之前升级到 macOS Mojave 的同学都会经历过一条命令: 执行如上命令会开启苹果之前的字体渲染方式 -- 子像素抗锯齿。因为苹果在 Mojave 系统上启用了新的灰度抗锯齿模式,导致 Chrome 浏览器的字体实在无法直视,有幸今天 Chrome 浏览器更新到 72 版本后修复了这个问题。
实现一个名叫 的集合数据结构,要具有如下的方法 举例:
前阵子忙疯了,最近得空,来更新一下自己的博客 - 记一次 macOS 安装/配置 Jenkins 的过程,方便以后使用。 由于 macOS 新系统 Mojave 字体实在让人看着眼疼,昨天重新装回了 ,并且机智的用 备份了自己的项目配置,避免麻烦,配置上面的东西还是挺多的。
最近,Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也不例外。 根据实地测试,在部署了最新版内核并开启了 TCP BBR 的机器上,网速甚至可以提升好几个数量级。 于是我根据目前三大发行版的最新内核
今天在做在线预览功能的时候碰到了一个蛋疼的问题,office 格式都可以完美的适配,但是 txt 格式出现了乱码。没办法只能进行一个转码,然后再输出内容。
之前我们说过了运用面向协议的思想为控件添加 今天我们再来写一个基于 的初始化方法。在我的项目中,我没有将所有的 都放在一个 文件中,原因有两个:
在项目中,往往有这样的要求,用 API 进行登录之后在某个 的页面需要用 去验证身份(虽然我更喜欢用 去验证🙃)。 是苹果官方建议的控件来替代老旧的 。但是 的 无法共享 ,所以这时候就需要我们自己去管理 。(iOS 11 上新增了 来管理)
在将项目迁移到 Swift 3.1 后,我受到了几个警告的欢迎。它们似乎都没有特别难以修复,只是除了这个之外: Method ‘initialize()’ defines Objective-C class method ‘initialize’
--- 我有一个带有 和 的 ,我的 有一个 。 当我拉动刷新时, 的 消失了,但是刷新过程仍然在继续,即使进程完成并且我调用 的 方法,导航栏也不会恢复到正常大小。
我们在项目中,往往会遇到两个 Navigation Bar 样式不同的问题,如果直接用苹果官方的控件,会出现各种各样的 bug,因为苹果官方的 Navigation Bar 是共用的,所以在两个不同样式的 Navigation Bar 中做转场操作的时候就会出现各种问题。
最近做通知的时候需要对通知进行测试,之前没有做证书的经验,这次尝试了一下,写这篇文章备忘。 测试用的工具叫做 Pusher,下载地址:NWPusher。非常的好用。
Swift 是一门面向协议的编程语言,为什么这么说,请看 WWDC 视频 Protocol-Oriented Programming in Swift。
今天在项目中遇到了隐藏 功能的问题,例如:从 A push到 B 页面,A 页面的 是隐藏的,但是 B 页面的 是需要显示的。
对 http 的抓包非常的简单,但是对 https 的抓包就有点麻烦了,主要麻烦在证书的安装与设置上。昨天由于有需要去抓https 的包,但是装好证书后,手机一直连不上,特此记录一下。
尽管很多人了解 RxJava 的基本逻辑,但是在 Observable 链和操作符究竟运行在哪个线程,仍然会有许多困惑。 首先,让我们梳理清晰,在 RxJava 中 和 区别:
好消息:Swift 4.2 现已在 Xcode 10 beta 中提供!此版本更新重要的 Swift 4.1 功能,并改进语言以准备 ABI 稳定性。
在之前的一篇文章中【iOS 并发,锁,线程同步【一】GCD】,我们讨论了一下 的并发,锁和线程同步的问题,今天,我们来讨论一下 的并发与线程同步。
用 Objective-C 等面向对象语言编程时,“对象”(object)就是“基本构造单元”(building block),开发者可以通过对象来存储并传递数据。在对象之间传递数据并执行任务的过程就叫做“消息传递”(Messaging)。若想编写出高效且易维护的代码,就一定要熟悉这两个特性的工作原理。
--- Objective-C 与 C++,Java 等面向对象的语言类似,不过在很多地方还是有所差别。Objective-C 使用“消息结构”(messaging structure)而非“函数调用”(function calling)。
我们都知道 Objective-C 是一门动态的语言,有的时候我们会使用 处理一些在 Objective-C 上面无法实现或者很难实现的功能。例如:在扩展中添加属性;动态的获取属性的名称,方法名等。那么究竟什么是 ?
无并发,不编程。并发在开发中是非常重要的一个技术,运用并发技术,可以写出高性能的程序,并发能够有效地利用多核心 CPU 的优势来提高数据处理的速度。作为一个码农,学好并发是十分有必要的。iOS有四种多线程编程的技术,分别是:NSThread,Cocoa NSOperation,GCD(全称:Grand Central Dispatch), pthread。今天我们就重点讲一讲 GCD 中的并发
我在使用 Playground 的时候,喜欢将自定运行(Automatically Run)修改为手动运行(Manually Run),因为自动运行有时会导致我的 Xcode 卡住,体验非常不好。但是 Playground 并没有相应的快捷键去手动执行 Playground,这又导致手动运行的时候操作繁琐,每次都要靠鼠标去点,作为一个程序员怎么能忍受这种没有效率的操作 😂
--- KVC 是调用属性访问器方法或以其他方式访问属性的一种方法。 “以其他方式访问”是什么意思? 对于 KVC 而言,没有访问器方法的实例变量会被视为非正式属性。 如果没有找到匹配的访问器对,它将直接获取或设置实例变量的值。 (是的,在现代代码中这是不值得使用的,总是为任何你想访问的任何东西声明一个 ,反之,不要使用 KVC 来访问任何不属于公共属性的东西
* 产生特定的一个元素: just * 经过一段延时: timer * 从一个序列拉取元素: from * 重复的产生某一个元素: repeatElement * 存在自定义逻辑: create * 每次订阅时产生: deferred * 每隔一段时间,发出一个元素: interval * 在一段延时后: timer * 一个空序列
- - - - 和 都能够将元素转化为 但是他们有本质的区别: 创建 发出唯一的一个元素。 操作符将某一个元素转换为 。
- - - - 函数响应式编程是种编程范式。它是通过构建函数操作数据序列,然后对这些序列做出响应的编程方式。它结合了函数式编程以及响应式编程。
- - - - 可以用于描述元素异步产生的序列。这样我们生活中许多事物都可以通过它来表示。 创建序列最直接的方法就是调用 ,然后在构建函数里面描述元素的产生过程。 就代表产生了一个元素,他的值是 。后面又产生了 个元素分别是 。最后,用 表示元素已经全部产生,没有更多元素了。
- - - - 一旦序列里面产出了一个 事件,整个序列将被终止。RxSwift 主要有两种错误处理机制: * retry - 重试 * catch - 恢复
- - - - - - - - 可以用来描叙任意一种观察者。 例如: 打印网络请求结果:
- - - - 是 Rx 实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。 如果你曾经使用过 , 那你对以下代码应该不会陌生:
Swift 的协议和 Objective-C 的协议不同。Swift 协议可以被用作代理,也可以让你对接口进行抽象 (比如 和 )。它们和 Objective-C 协议的最大不同在于我们可以让结构体和枚举类型满足协议。除此之外,Swift 协议还可以有关联类型。我们还可以通过协议扩展的方式为协议添加方法实现。我们会在面向协议编程的部分讨论所有这些内容。
- - - - - - - - 这个动画是用 实现的,简单讲下 的工作原理。这里用到的 也就3部分:(简称VC)、、。
和大多数先进语言一样,Swift 拥有不少能被归类于泛型编程下的特性。使用泛型代码,你可以写出可重用的函数和数据结构,只要它们满足你所定义的约束,它们就能够适用于各种类型。比如,像是 和 等多个类型,实际上是它们中的元素类型就是泛型抽象。我们也可以创建泛型方法,它们可以对输入或者输出的类型进行泛型处理。 就定义了一个可以作用于任意类型 A 的函数。某种意义上
Swift 支持重载操作符的特性,让我们可以自定义一些简单的计算。 最经典的例子就是两个二维向量之间的计算了。 首先我们定义一个二维向量,并创建两个向量
- - - - 大部分编程语言使用整数值对字符串进行下标操作,比如 将会返回 中的第六个“字符” (这里的“字符”的概念由所操作的编程语言进行定义)。Swift 不允许这么做。为什么?答案可能现在你已经很耳熟了:因为整数的下标访问无法在常数时间内完成 (对于 协议来说这也是个直观要求),而且查找第 n 个 的操作也必须要对它之前的所有字节进行检查。
* Authors: Michael Ilseman (compiled through conversations with many others)
将程序内部的数据结构序列化为一些可交换的数据格式,以及反过来将通用的数据格式反序列化为内部使用的数据结构,这在编程中是一项非常常见的任务。Swift 将这些操作称为编码(encoding)和解码(decoing)。Swift 4 的一个主要特性就是定义了一套标准的编码和解码数据的方法,所有的自定义类型都能选择使用这套方法。
在 中使用通知,在写通知名称的时候,并不能像 那样简单方便,一个字符串搞定。刚开始使用 通知时,感觉各种不爽,需要这样写:
Judging by the number of talks, articles and discussions related to reactive programming in Swift, it looks like the community has been taken by the storm
- - - - 逃逸闭包(escaping closure),什么是逃逸闭包?苹果官方给的定义是:当一个闭包作为一个参数传递给函数,但是它是在函数返回之后调用的,这时候,这个闭包就称为逃逸闭包。当你声明一个将闭包作为参数的函数时,你可以在参数的类型之前用 来表明这个闭包是允许逃逸的。
在做 iOS 相关的约束动画时,我们一定会用到 函数,但是在大多数情况下使用并没有什么问题。当与 相关的控件结合使用的时候要注意了。
最近项目中遇到了一个崩溃,当点击图片选择保存的时候,并没有出现请求相册权限的对话框,而是直接就崩溃,并且没有任何错误信息。开始以为是权限没有添加,但是 是添加了的,搞不懂了。去翻了翻官方的文档,果然找到了解决方式。
- - - - 要理解 Swift 中的函数和闭包,需要先明白三件事情,按重要程度进行大致排序如下: 要将函数赋值给一个变量,比如 funVar,我们只需要将函数名字作为值就可以了。注意在函数名后没有括号:
- - - - 什么是栈(Stack)?这是计算机内存中的一个特殊区域,它存储由每个函数创建的临时变量(包括 函数)。栈是一个“LIFO”(后进先出)的数据结构。它是被 CPU 管理和优化的。每次函数声明一个新变量时,它都被“压入”栈中。然后每次函数退出时,所有由该函数压入栈的变量都被释放(也就是说,它们被删除)。一旦释放栈变量,该区域的内存就可用于其他栈变量
* 结构体 (和枚举) 是值类型,而类是引用类型。在设计结构体时,我们可以要求编译器保证不可变性。而对于类来说,我们就得自己来确保这件事情。
Swift 中可选值的定义如下 因为 是枚举类型,所以有的时候可以用模式匹配来进行一些巧妙的操作: * 使用 if case 来进行模式匹配,对非 nil 的值做 for 循环
- - - - Sequence定义: 要实现一个Sequence,首先需要提供一个返回迭代器(iterator)的 方法。 对于迭代器,它是一个满足 协议的类型。
- - - - 在Swift中,数组是值类型。并且Swift中,Swift标准库中的所有集合类型都使用了“写时复制”这一技术,避免了大量副本导致性能下降。值类型的好处,不仅是性能有提高,其次就是能保证数组的不可变。
之前我一直以为,Swift是一门弱类型的语言。 判断依据: Swift 变量不强制的指定类型,而是用 和 表示可变与不可变。所以,Swift是一门弱类型的语言。
如果你发现连不上你的 VPS了,那么有一种可能就是端口被封,我们需要改一下 VPS 端口了。 如何登陆 VPS 可以参考这篇文章: SSH 免密登陆 VPS
打开浏览器,输入 ,进入光猫管理页面,用 账户登陆。将地址栏中的连接 改为 。出来如下的界面: 启用 ,点击确定。
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。 简单来说,包就是文件夹,但该文件夹下必须存在 文件, 该文件的内容可以为空。 用于标识当前文件夹是一个包。 考虑一个在 目录下的 、、 文件, 为测试调用包的代码,目录结构如下:
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。 模块让你能够有逻辑地组织你的 Python 代码段。 把相关的代码分配到一个模块里能让你的代码更好用,更易懂。 模块能定义函数,类和变量,模块里也能包含可执行的代码。
我们在进行 SSH 登陆的时候,每次都需要输入密码,就感到十分的不方便,这里可以利用 SSH Key(ssh公钥) 来验证登录,从而实现免密登陆。
当我们再做开发,从github上面下载库的时候,总是很慢。pod setup 那是更加的慢。这里我们配置一下代理,速度立马就上去了。
现在苹果iOS系统已经原生支持了二维码扫描的功能,使用原生来扫描需要导入 AVFoundation 。 - - - - 一、获取摄像设备:
由于项目原来的设计,导致在OS X 10.10之后的系统上会出现一些奇怪的Bug,调用方法却并没有实现将视图放在最上层。经过不断的查找,才知道,子视图的父视图并没有被显示出来,导致了方法不起作用。那么如果将父视图显示出来的话,window button(关闭按钮,最小化按钮,全屏按钮,最大化窗口按钮)又会被遮盖掉,无奈,需要自定义window button
在Objective-C的ARC模式中, 这里虽然没有显示的声明为 ,但是 默认声明的一个对象就为 ,即: 和
之前解决了,点击登录无反应的 问题,今天又碰到了点击登陆后回调的 参数一直都是 的问题。 刚开始以为是我的配置文件出现了问题,一直修改 文件,但是问题依旧。问了技术支持,说让我升级到最新的版本,我又 一下,确实是最新的版本。之后觉得可能我的 不是最新的,又更新了我的 ,发现还是不行。我看了一下 的版本,确实是4.0.4最新的没错啊
- - - - 你可以定义一个由自己想要功能的函数,以下是简单的规则: * 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。 * 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。 * 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 * 函数内容以冒号起始,并且缩进。 * return [表达式] 结束函数,选择性地返回一个值给调用方
今天执行 命令的时候出现了 的错误,类似于如下: * Run pod search PureLayout * List the search result * can not get the result list, and shows JSON::ParserError - A JSON text must at least contain two octets
- - - - 你可以根据需求选取各种格式,但是最简单的获取可读的时间模式的函数是asctime():
- - - - * 在 Python 里,标识符由字母、数字、下划线组成。 * 在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。 * Python 中的标识符是区分大小写的。 * 以下划线开头的标识符是有特殊意义的。以单下划线开头 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 而导入; * 以双下划线开头的 代表类的私有成员
I had a presentation (in Japanese) about RxTest at RxSwift Meetup held at Tokyo
执行 git 命令后,提示信息如下: 运行如下命令: 等安装好了之后,git 就又可以用了。 如果不行可以试试下面的命令:
在 Swift 中无法使用 ,Swift 中有如下的标记: 接下来给 和 加上警告,实现类似的效果: Build Phases ---> add a new Build Phases ---> New run script phase
- - - - 我发现不少人都不会经常更新,或者只在必须用某个工具的新版本的时候才更新。他们的看法是,更新有可能产生一些意外的问题,反正当前环境足够稳定可以用,干嘛自找麻烦呢? 这个看法对也不对。对是因为,更新产生的潜在问题不可避免。不对是因为总有一天你需要升级的,也许是为了某个工具的新特性,也许是为了修复软件的漏洞,也许你安装的包非要依赖另一个包的新版本,等等。如果隔了很长一段时间才升级
因为在版本之后,之前的命令就不适用了,我们可以用如下的命令来安装CocoaPods
加入软连接:
在 python 中简单的打开一个文件可以用 的方式 文件路径。 打开的方式。 参数如下:
如果想让代码中可以输入中文,必须要加上这一句。 Python 中定义一个函数用 关键字,函数没有大括号,用tab空格代表方法体。