Swift Tips

三言两语,话说 Swift。
Read more →

[译] Swift 编译器

翻译自 Swift Compiler
Read more →

iOS 多线程技术实践之 pthreads(一)

在现代计算机中,操作系统一般都会支持多进程以及多线程技术,使得其可以同时运行多个程序且效率更高。而我们在开发 iOS app 中也时常需要利用到这些特性,以为用户提供更加良好的使用体验。通常来说,一个 iOS app 为一个进程,其中又至少有一个线程,即主线程;前者进程由操作系统创建我们很难干预,而线程则「自由」许多,可以为我们所用。由于多线程技术内容较多,我将把相关内容进行拆分,本文作为该系列第一篇,先从 pthreads 说起。
Read more →

iOS 中的库与框架

随着软件工程的发展,很多我们需要的功能前人都已经很好地实现了,为了提高效率避免重复建设,这些功能实现的代码被封装为代码库,有时也称框架。我们只需要在用到的时候通过依赖管理工具将它们以适当的方式引入即可。本文将简单聊聊 iOS 中的库与框架相关概念。
Read more →

SwiftTips in Reverse

SwiftTipsJohn Sundell 在 GitHub 开源的 Swift 小技巧列表。随着 Swift 5 的发布以及 ABI 稳定,是时候再学习一遍 Swift 啦。本文将是该列表的实践版本,并保证文中代码的可运行性,且尽可能做到倒序日更。(But why in reverse? 🤫)
Read more →

Xcode 中的 Link Map 文件

Link Map File,译作链接映射文件。Xcode 在构建可执行文件之前,需要先编译为目标文件(Object File),并链接所需要的其他库,那么 Link Map 文件就记录了链接器(Linker)在链接过程中产生的一些信息,本文将谈谈这个文件的构成。
Read more →

[译] 摊平由「try?」造成的嵌套可选

Flatten nested optionals resulting from ‘try?'
Read more →

Swift/Obj-C 混编项目升级 Swift 5.0 踩坑

在 ABI 稳定前,每次 Swift 升级都是一个比较「痛苦」的体验。这次笔者花费约总共一天时间将 Swift/Obj-C 混编项目升级到 Swift 5.0,其中还是有一些踩坑经验值得分享的。
Read more →

Obj-C & Swift 的类型内省与反射

许多编程语言中都有类型内省(又称自省,Introspection)和反射(Reflection)这两个概念,本文将探讨一下 Obj-C 和 Swift 中类型内省和反射的相关概念与具体使用。
Read more →

[译] Swift 名字修饰(Name Mangling)

翻译自 Friday Q&A 2014-08-08: Swift Name Mangling
Read more →

Combine

三言两语,话说 Swift。
Read more →

Swift 中的 inout

Swift 中的 inout 本质是按引用传递 var foo = 5 func inoutDemoFunc(_ innerFoo: inout Int) { innerFoo = 9 } inoutDemoFunc(&foo) // BREAKPOINT ⚠️ 将以上代码转换为汇编: ; inout demo`main: 0x100000b10 <+0>: pushq %rbp 0x100000b11 <+1>: movq %rsp, %rbp 0x100000b14 <+4>: subq $0x30, %rsp 0x100000b18 <+8>: leaq 0x651(%rip), %rax ; demo.foo : Swift.Int 0x100000b1f <+15>: xorl %ecx, %ecx 0x100000b21 <+17>: movq $0x5, 0x644(%rip) ; _swift_FORCE_LOAD_$_swiftCompatibility50 0x100000b2c <+28>: movl %edi, -0x1c(%rbp) -> 0x100000b2f <+31>: movq %rax, %rdi 0x100000b32 <+34>: leaq -0x18(%rbp), %rax 0x100000b36 <+38>: movq %rsi, -0x28(%rbp) 0x100000b3a <+42>: movq %rax, %rsi 0x100000b3d <+45>: movl $0x21, %edx 0x100000b42 <+50>: callq 0x100000ec4 ; symbol stub for: swift_beginAccess ; 参数传递 ⬇ 0x100000b47 <+55>: leaq 0x622(%rip), %rdi ; demo.
Read more →

Swift 中的内联函数

内联函数(Inline Functions)指编译时刻将函数调用展开成函数体。在 Xcode 中的 Swift 项目中,如果开启了编译器优化(Release 模式默认会开启优化),编译器会自动将某些函数变成内联函数。但若函数存在以下特点将不会被自动内联: 函数体比较长(内联会导致可执行代码体积增大) 包含递归调用(内联会导致死循环) 包含动态派发(编译时刻无法确认要执行的代码) func foo() { print("foo") // 开启优化后断点需打在该行(函数已被优化为内联函数) } foo() // 默认断点打在该行 将以上代码转换为汇编: // DEBUG 默认(No Optimization [-Onone]) demomain: 0x100000a50 &lt;+0&gt;: pushq %rbp 0x100000a51 &lt;+1&gt;: movq %rsp, %rbp 0x100000a54 &lt;+4&gt;: subq $0x10, %rsp 0x100000a58 &lt;+8&gt;: movl %edi, -0x4(%rbp) 0x100000a5b &lt;+11&gt;: movq %rsi, -0x10(%rbp) ; 函数调用(下面开启编译器优化后,则不存在该行汇编指令) -&gt; 0x100000a5f &lt;+15&gt;: callq 0x100000a70 ; demo.foo() -&gt; () at main.swift:11 0x100000a64 &lt;+20&gt;: xorl %eax, %eax 0x100000a66 &lt;+22&gt;: addq $0x10, %rsp 0x100000a6a &lt;+26&gt;: popq %rbp 0x100000a6b &lt;+27&gt;: retq // DEBUG(Xcode - Target - Build Settings - Swift Compiler - Optimization Level - DEBUG: Optimize for Speed [-O]) demomain: 0x100000a10 <+0>: pushq %rbp 0x100000a11 <+1>: movq %rsp, %rbp 0x100000a14 <+4>: pushq %rbx 0x100000a15 <+5>: pushq %rax 0x100000a16 <+6>: xorl %edi, %edi 0x100000a18 <+8>: callq 0x100000b10 ; type metadata accessor for Swift.
Read more →

Objective-C 与 Swift 桥接中的坑

Objective-C 与 Swift 的混编是全面转向 Swift 中的必经之路,本篇即是这一过程中的踩坑「真实」记录。
Read more →

在 Swift 中对集合类型元素的弱引用

在 Swift 中对集合类型元素的弱引用。
Read more →