<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>派发 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E6%B4%BE%E5%8F%91/</link><description>Recent content in 派发 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 16 Jun 2026 09:06:27 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%B4%BE%E5%8F%91/index.xml" rel="self" type="application/rss+xml"/><item><title>Swift 面试：泛型、协议与派发源码解析</title><link>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/generics-protocol-dispatch/</link><pubDate>Tue, 16 Jun 2026 09:06:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/generics-protocol-dispatch/</guid><description>&lt;h1 id="swift-面试泛型协议与派发源码解析"&gt;Swift 面试：泛型、协议与派发源码解析&lt;/h1&gt;
&lt;p&gt;Swift 面试里，泛型和协议经常不是单独问语法，而是连着问：&lt;strong&gt;Swift 中函数派发机制有哪几种？泛型是编译期还是运行期机制？协议调用为什么可能慢？&lt;code&gt;some&lt;/code&gt; 和 &lt;code&gt;any&lt;/code&gt; 为什么性能不同？Protocol Witness Table 到底是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这篇文章按面试题展开，把答案落到 Swift 编译器里的 Generic Signature、Generic Specializer、SIL 调用指令、Protocol Witness Table、class vtable 和 Devirtualize 优化。&lt;/p&gt;
&lt;h2 id="面试高频问题"&gt;面试高频问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Swift 中函数派发机制有哪几种？&lt;/li&gt;
&lt;li&gt;直接派发、class vtable 派发、witness table 派发、Objective-C 消息派发分别适用于什么场景？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function_ref&lt;/code&gt;、&lt;code&gt;class_method&lt;/code&gt;、&lt;code&gt;witness_method&lt;/code&gt;、&lt;code&gt;objc_method&lt;/code&gt; 在 SIL 里分别代表什么？&lt;/li&gt;
&lt;li&gt;如何用 &lt;code&gt;swiftc -emit-silgen&lt;/code&gt; / &lt;code&gt;swiftc -emit-sil -O&lt;/code&gt; 观察派发指令？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dynamic&lt;/code&gt; / &lt;code&gt;@objc dynamic&lt;/code&gt; 会怎样影响派发？&lt;/li&gt;
&lt;li&gt;如何用代码对比泛型、&lt;code&gt;some&lt;/code&gt;、&lt;code&gt;any&lt;/code&gt; 的派发和性能差异？&lt;/li&gt;
&lt;li&gt;Swift 泛型是运行时泛型还是编译期泛型？&lt;/li&gt;
&lt;li&gt;Generic Signature 是什么？它保存哪些信息？&lt;/li&gt;
&lt;li&gt;泛型特化为什么能提升性能？&lt;/li&gt;
&lt;li&gt;Protocol Witness Table 是什么？&lt;/li&gt;
&lt;li&gt;协议方法调用什么时候是静态派发，什么时候是动态派发？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;some Protocol&lt;/code&gt; 和 &lt;code&gt;any Protocol&lt;/code&gt; 的本质区别是什么？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;final&lt;/code&gt;、&lt;code&gt;private&lt;/code&gt;、具体类型为什么有利于优化？&lt;/li&gt;
&lt;li&gt;协议扩展里的方法一定是动态派发吗？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;class_method&lt;/code&gt; 和 &lt;code&gt;witness_method&lt;/code&gt; 有什么区别？&lt;/li&gt;
&lt;li&gt;面试里如何解释“Swift 既强调协议，又强调性能”？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="30-秒回答版"&gt;30 秒回答版&lt;/h2&gt;
&lt;p&gt;Swift 函数派发面试不要只答“静态派发和动态派发”。更完整的分类是：&lt;strong&gt;直接派发&lt;/strong&gt;、&lt;strong&gt;class vtable 派发&lt;/strong&gt;、&lt;strong&gt;protocol witness table 派发&lt;/strong&gt;、&lt;strong&gt;Objective-C 消息派发&lt;/strong&gt;，再补充优化器可能把动态调用去虚拟化成直接调用。&lt;/p&gt;</description></item></channel></rss>