tips

语法/算法,调试,维护。从零开始,每个概念理解清楚。

Swifter-Swift 开发者必备 Tips (第四版),王巍版本 柯里化 (Currying) Swift 里可以将方法进行柯里化 (Currying),这是也就是把接受多个参数的方法进行一些变形,使其更加灵活的方法。函数式的编程思想贯穿于 Swift 中,而函数的柯里化正是这门语言函数式特点的重要表现。 举个例子,下面的函数简单地将输入的数字加 1: func addOne(num: Int) -> Int { return num + 1 } 这个函数所表达的内容非常有限,如果我们之后还需要一个将输入数字加 2,或者加 3 的函数,可能不得不类似地去定义返回为 num + 2 或者 num + 3 的版本。有没有更通用的方法呢?我们其实可以定义一个通用的函数,它将接受需要与输入数字相加的数,并返回一个函数。返回的函数将接受输入数字本身,然后进行操作: func addTo(_ adder: Int) -> (Int) -> Int { return { num in return num + adder } } 有了 addTo,我们现在就能轻易写出像是 addOne 或者 addTwo 这样的函数了: let addTwo = addTo(2) // addTwo: Int -> Int let result = addTwo(6) // result = 8 再举一个例子,我们可以创建一个比较大小的函数: func greaterThan(_ comparer: Int) -> (Int) -> Bool { return { $0 > comparer } } let greaterThan10 = greaterThan(10); greaterThan10(13) // => true greaterThan10(9) // => false 柯里化是一种量产相似方法的好办法,可以通过柯里化一个方法模板来避免写出很多重复代码,也方便了今后维护。 举一个实际应用时候的例子,在 Selector 一节中,我们提到了在 Swift 中 Selector 只能使用字符串在生成。这面临一个很严重的问题,就是难以重构,并且无法在编译期间进行检查,其实这是十分危险的行为。但是 target-action 又是 Cocoa 中如此重要的一种设计模式,无论如何我们都想安全地使用的话,应该怎么办呢?一种可能的解决方式就是利用方法的柯里化。Ole Begemann 在这篇帖子里提到了一种很好封装,这为我们如何借助柯里化,安全地改造和利用 target-action 提供了不少思路。 protocol TargetAction { func performAction() } struct TargetActionWrapper: TargetAction { weak var target: T? let action: (T) -> () -> () func performAction() -> () { if let t = target { action(t)() } } } enum ControlEvent { case TouchUpInside case ValueChanged // ... } class Control { var actions = [ControlEvent: TargetAction]() func setTarget(target: T, action: @escaping (T) -> () -> (), controlEvent: ControlEvent) { actions[controlEvent] = TargetActionWrapper( target: target, action: action) } func removeTargetForControlEvent(controlEvent: ControlEvent) { actions[controlEvent] = nil } func performActionForControlEvent(controlEvent: ControlEvent) { actions[controlEvent]?.performAction() } } 模式匹配 在之前的正则表达式中,我们实现了 =~ 操作符来完成简单的正则匹配。虽然在 Swift 中没有内置的正则表达式支持,但是一个和正则匹配有些相似的特性其实是内置于 Swift 中的,那就是模式匹配。 当然,从概念上来说正则匹配只是模式匹配的一个子集,但是在 Swift 里现在的模式匹配还很初级,也很简单,只能支持最简单的相等匹配和范围匹配。在 Swift 中,使用 ~= 来表示模式匹配的操作符。如果我们看看 API 的话,可以看到这个操作符有下面几种版本: func ~=(a: T, b: T) -> Bool func ~=(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool func ~=(pattern: I, value: I.Bound) -> Bool 从上至下在操作符左右两边分别接收可以判等的类型,可以与 nil 比较的类型,以及一个范围输入和某个特定值,返回值很明了,都是是否匹配成功的 Bool 值。你是否有想起些什么呢..没错,就是 Swift 中非常强大的 switch,我们来看看 switch 的几种常见用法吧: 可以判等的类型的判断 let password = "akfuv(3" switch password { case "akfuv(3": print("密码通过") default: print("验证失败") } 对 Optional 的判断 let num: Int? = nil switch num { case nil: print("没值") default: print("\(num!)") } 对范围的判断 let x = 0.5 switch x { case -1.0...1.0: print("区间内") default: print("区间外") } 这并不是巧合。没错,Swift 的 switch 就是使用了 ~= 操作符进行模式匹配,case 指定的模式作为左参数输入,而等待匹配的被 switch 的元素作为操作符的右侧参数。只不过这个调用是由 Swift 隐式地完成的。于是我们可以发挥想象的地方就很多了,比如在 switch 中做 case 判断的时候,我们完全可以使用我们自定义的模式匹配方法来进行判断,有时候这会让代码变得非常简洁,具有条理。我们只需要按照需求重载 ~= 操作符就行了,接下来我们通过一个使用正则表达式做匹配的例子加以说明。 首先我们要做的是重载 ~= 操作符,让它接受一个 NSRegularExpression 作为模式,去匹配输入的 String: func ~=(pattern: NSRegularExpression, input: String) -> Bool { return pattern.numberOfMatches(in: input, options: [], range: NSRange(location: 0, length: input.characters.count)) > 0 } 然后为了简便起见,我们再添加一个将字符串转换为 NSRegularExpression 的操作符 (当然也可以使用 StringLiteralConvertible,但是它不是这个 tip 的主题,在此就先不使用它了): prefix operator ~/ prefix func ~/(pattern: String) -> NSRegularExpression { return NSRegular[removed]pattern: pattern, options: nil, error: nil) } 现在,我们在 case 语句里使用正则表达式的话,就可以去匹配被 switch 的字符串了:
<think>嗯,用户这次的问题很明确:想找与“tips软件”或“小工具”相关的实用工具推荐。从对话历史看,用户之前询问过获取技巧的方法,现在聚焦在具体工具上,说明ta可能正在寻找能提高效率的实用软件。 用户提供的四个引用虽然内容零散,但透露出关键线索:ta关注的工具类型主要是科研辅助(文献管理)、开发工具(前端IDE)、系统工具(Linux录屏)和设计工具(PCB设计)。这些领域跨度较大,说明用户可能是多场景使用者,或是想全面了解各类效率工具。 特别注意到用户强调“参考站内引用”,但引用内容与当前问题关联度不高。Zotero和WebStorm这些案例更多是示意,需要跳出引用范围给出更系统的推荐。不过从引用[3][4]能看出用户对Linux和设计工具有兴趣,可以强化这两类推荐。 用户用“tips软件”这个关键词有点模糊,可能指:1)专门提供技巧的软件 2)自带技巧提示的功能型工具 3)提升操作效率的小工具。结合上下文,第三种解释最合理,所以重点推荐效率工具而非教学软件。 在推荐策略上要把握三点:一是覆盖用户暗示的多个专业领域(科研/开发/设计),二是突出“小工具”的轻量化特性,三是强调免费或开源选项——因为引用[1]提到Zotero时特别赞赏其免费开源。 最后生成的三个相关问题都围绕工具选择技巧,这样既能延续对话,又符合用户爱研究工具的性格(从ta查文献管理、前端开发等专业工具可看出)。</think>基于您对效率工具的需求,结合不同场景推荐以下实用工具,并附使用技巧: --- ### 📚 文献管理工具 1. **Zotero** - **核心功能**:自动捕获网页文献信息,一键生成参考文献 - **技巧**: - 用浏览器插件直接保存论文/网页[^1] - 安装`Zotfile`插件管理PDF批注 - 链接云盘突破300MB存储限制 - **适用人群**:学生/科研工作者 --- ### 💻 开发工具 2. **WebStorm** - **优势**:开箱即用的前端开发环境 - **技巧**: - `Ctrl+鼠标悬停`实时查看CSS值 - `Alt+Enter`快速修复ESLint错误[^2] - 内置HTTP调试客户端测试API - **适用场景**:JavaScript/TypeScript项目 3. **Byzanz**(Linux动态录屏) - **特色**:生成轻量GIF教程 - **技巧**: ```bash # 录制10秒动态操作(含5秒延迟) byzanz-record -d 10 --delay=5 -c ~/demo.gif ``` - 配合`xwininfo`获取窗口坐标[^3] --- ### 🎨 设计辅助工具 4. **Altium Designer**(PCB设计) - **高效操作**: - `Shift+Ctrl+G`:全局栅格设置 - `Ctrl+M`:实时测量距离[^4] - 规则设置:线路宽度范围调为10-100mil避免布线错误 --- ### 🧰 其他效率神器 | 工具类型 | 推荐工具 | 核心价值 | |----------------|----------------|-----------------------------| | 多平台剪贴板 | Ditto | 历史记录+跨设备同步 | | 快速启动器 | Wox+Everything | 文件秒搜/快捷命令执行 | | 截图标注 | Snipaste | 贴图功能+高级标注工具 | --- ### 💎 选择建议 ```mermaid graph LR A[需求场景] --> B{工具推荐} B -->|文献管理| C[Zotero+插件] B -->|前端开发| D[WebStorm] B -->|Linux录屏| E[Byzanz] B -->|硬件设计| F[Altium Designer] B -->|通用效率| G[Ditto/Snipaste] ``` > 提示:专业工具如Zotero、Altium Designer需针对性学习快捷键,初期投入时间可提升长期效率[^1][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值