{"id":482407,"date":"2026-06-04T13:44:00","date_gmt":"2026-06-04T13:44:00","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=482407"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=482407","title":{"rendered":"Existential Container \u0432 Swift: \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Existential Container \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u0435\u0445 \u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043d\u0430 middle \u0438 senior iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0415\u0441\u043b\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c layout \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043f\u0440\u043e\u0449\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043c: <code>any<\/code> vs <code>some<\/code>, Protocol with Associated Types, type erasure \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c protocol dispatch.<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438.<\/p>\n<h3>\u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430: 15 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438<\/h3>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Existential Container?<\/h4>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0442\u0438\u043f\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443\u00bb. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>any P<\/code> (\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e <code>P<\/code> \u0434\u043e Swift 5.6).<\/p>\n<h4>\u041a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0443 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e Existential Container \u043d\u0430 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435?<\/h4>\n<p><strong>40 \u0431\u0430\u0439\u0442<\/strong> (5 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u043f\u043e 8 \u0431\u0430\u0439\u0442 \u043a\u0430\u0436\u0434\u043e\u0435).<\/p>\n<h4>\u0418\u0437 \u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440?<\/h4>\n<p>\u0422\u0440\u0438 \u0441\u043b\u043e\u0442\u0430 <strong>inline buffer<\/strong> (24 \u0431\u0430\u0439\u0442\u0430) + \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <strong>type metadata<\/strong> + \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <strong>Protocol Witness Table<\/strong>. \u0418\u0442\u043e\u0433\u043e \u2014 5 \u0441\u043b\u043e\u0432.<\/p>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 inline buffer \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d?<\/h4>\n<p>\u042d\u0442\u043e \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 24 \u0431\u0430\u0439\u0442\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f <strong>inline-\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/strong>, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0442\u0443\u0434\u0430 \u0432\u043b\u0435\u0437\u0430\u0435\u0442. \u041f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<h4>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 24 \u0431\u0430\u0439\u0442?<\/h4>\n<p>\u0411\u0443\u0434\u0435\u0442 <strong>\u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 heap<\/strong>, \u0430 \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0442 inline buffer \u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u0442\u0443 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e. \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>malloc<\/code> \/ <code>free<\/code>.<\/p>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 type metadata?<\/h4>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0442\u0438\u043f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435: kind (class\/struct\/enum), size, alignment, \u0438\u043c\u044f, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 Value Witness Table. \u041b\u0435\u0436\u0438\u0442 \u0432 read-only \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f.<\/p>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Value Witness Table (VWT)?<\/h4>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c: <code>copy<\/code>, <code>destroy<\/code>, <code>move<\/code>, <code>assign<\/code>. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430: \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c.<\/p>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Protocol Witness Table (PWT)?<\/h4>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b (\u0442\u0438\u043f, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 existential.<\/p>\n<h4>\u0427\u0435\u043c \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 PWT \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430?<\/h4>\n<p><strong>Indirect call<\/strong> \u0445\u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u0438 \u043c\u0435\u0448\u0430\u0435\u0442 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0435\u043c direct call.<\/p>\n<h4>\u041a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f protocol composition (any P1 &amp; P2)?<\/h4>\n<p>\u0420\u0430\u0441\u0442\u0451\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e: \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0432\u043e (\u043f\u043e\u0434 Protocol Witness Table). <code>any P1 &amp; P2<\/code> \u2014 6 \u0441\u043b\u043e\u0432, <code>any P1 &amp; P2 &amp; P3<\/code> \u2014 7 \u0441\u043b\u043e\u0432 \u0438 \u0442.\u0434.<\/p>\n<h4>\u0427\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0443 class-only \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 (protocol P: AnyObject)?<\/h4>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u0438\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435 \u2014 \u0432\u0441\u0435\u0433\u043e <strong>2 \u0441\u043b\u043e\u0432\u0430<\/strong> (16 \u0431\u0430\u0439\u0442): \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 + \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 PWT. Inline buffer \u0438 type metadata \u043d\u0435 \u043d\u0443\u0436\u043d\u044b: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 metadata \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 isa-pointer \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<h4>\u0427\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0443 \u0442\u0438\u043f\u0430 Error?<\/h4>\n<p>\u0423 <code>Error<\/code> \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442: <strong>\u043e\u0434\u0438\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c<\/strong> \u043d\u0430 heap-\u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u00aberror box\u00bb. \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f bridging \u0441 <code>NSError<\/code> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u044b <code>try\/catch<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 error \u2014 \u044d\u0442\u043e heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u043e Swift 5.7 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Hashable \u0438 Protocol with Associated Types \u043a\u0430\u043a existential?<\/h4>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0438\u0445 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u0445 \u0435\u0441\u0442\u044c <code>Self<\/code> \u0438\u043b\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435 \u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445, \u0433\u0434\u0435 \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 <code>Self<\/code> \u0438\u043b\u0438 <strong>associated type<\/strong>. \u0423 existential \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0435\u0433\u043e dynamic type, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<h4>\u0427\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0432 Swift 5.7?<\/h4>\n<p>\u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c <code>any Hashable<\/code>, <code>any Equatable<\/code> \u0438 \u0442. \u043f. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c <strong>implicit opening<\/strong> \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u00ab\u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435\u00bb existential \u0432 generic-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0432 generic-\u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u042d\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u043d\u0435 runtime-\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430.<\/p>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c any P?<\/h4>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 (witness table dispatch \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 direct call); \u0434\u043b\u044f conforming-\u0442\u0438\u043f\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 24 \u0431\u0430\u0439\u0442 (heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438); \u043a\u043e\u0433\u0434\u0430 \u0442\u0438\u043f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0434\u0438\u043d \u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u2014 \u0442\u0430\u043c \u043b\u0443\u0447\u0448\u0435 generic \u0438\u043b\u0438 <code>some<\/code>.<\/p>\n<hr\/>\n<h2>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440<\/h2>\n<h3>1. \u041a\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 Existential Container<\/h3>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442:<\/p>\n<pre><code class=\"swift\">protocol Animal {    func makeSound()}struct Dog: Animal {    let name: String    func makeSound() { print(\"\\(name): Woof!\") }}struct Cat: Animal {    let mood: String    let age: Int    func makeSound() { print(\"Meow\") }}struct Whale: Animal {    let location: GPSCoordinate    let dna: [DNASegment]   \/\/ \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432    func makeSound() { print(\"...\") }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440\u044b \u0443 \u043d\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0435: \u0443 <code>Dog<\/code> \u2014 16 \u0431\u0430\u0439\u0442, \u0443 <code>Cat<\/code> \u2014 24, \u0443 <code>Whale<\/code> \u2014 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442. \u041d\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"swift\">let animal: any Animal = Dog(...)let animals: [any Animal] = [Dog(...), Cat(...), Whale(...)]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 <code>Animal<\/code>. \u0422\u0438\u043f <code>any Animal<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c <strong>\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440<\/strong> (\u0438\u043d\u0430\u0447\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c), \u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e<\/strong> \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p><strong>\u0412\u0441\u0435\u0433\u0434\u0430 \u043a\u043b\u0430\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 heap, \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c.<\/strong> \u041a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u0434\u043e\u0440\u043e\u0433\u043e \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0443\u0444\u0435\u0440.<\/strong> \u0420\u0430\u0441\u0442\u043e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0438\u0431\u0440\u0438\u0434: \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 inline, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u2014 \u0432 heap.<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>Swift \u0432\u044b\u0431\u0440\u0430\u043b \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0445\u0440\u0430\u043d\u0438\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e <strong>\u0442\u0438\u043f\u0435<\/strong> (\u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u2014 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0430\u0431\u043b\u0438\u0446\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430<\/strong> (\u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 <code>animal.makeSound()<\/code>).<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>2. \u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f opaque Existential Container<\/h3>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 (\u00abopaque\u00bb) Existential Container \u043d\u0430 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 <strong>5 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432<\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c <strong>40 \u0431\u0430\u0439\u0442<\/strong>:<\/p>\n<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 Slot 0  \u2502 Inline buffer word 0                   \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Slot 1  \u2502 Inline buffer word 1                   \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Slot 2  \u2502 Inline buffer word 2                   \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Slot 3  \u2502 Type metadata pointer                  \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Slot 4  \u2502 Witness table pointer                  \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435:<\/p>\n<ul>\n<li>\n<p><strong>Slots 0\u20132 (24 \u0431\u0430\u0439\u0442\u0430)<\/strong> \u2014 inline buffer. \u0421\u044e\u0434\u0430 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0432\u043b\u0435\u0437\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 heap-\u043a\u043e\u043f\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p><strong>Slot 3<\/strong> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 type metadata \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Slot 4<\/strong> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 Protocol Witness Table \u0434\u043b\u044f \u043f\u0430\u0440\u044b (\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"swift\">print(MemoryLayout&lt;any Animal&gt;.size)  \/\/ 40<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442<\/strong> \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043b\u0435\u0436\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438. \u041b\u044e\u0431\u043e\u0439 <code>any Animal<\/code> \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 40 \u0431\u0430\u0439\u0442. \u042d\u0442\u043e \u00ab\u0435\u0434\u0438\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u00bb, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/p>\n<hr\/>\n<h3>3. \u0413\u0440\u0430\u043d\u0438\u0446\u0430 24 \u0431\u0430\u0439\u0442\u0430: inline vs heap<\/h3>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 inline buffer\u2019\u0430 \u2014 24 \u0431\u0430\u0439\u0442\u0430. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0451\u043c \u2014 \u043e\u043d\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f inline. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 heap.<\/p>\n<pre><code class=\"swift\">struct Small: Animal {    let x: Int   \/\/ 8 \u0431\u0430\u0439\u0442    func makeSound() {}}struct Medium: Animal {    let x: Int   \/\/ 8    let y: Int   \/\/ 8    let z: Int   \/\/ 8    func makeSound() {}}struct Big: Animal {    let x: Int   \/\/ 8    let y: Int   \/\/ 8    let z: Int   \/\/ 8    let w: Int   \/\/ 8 \u2014 \u043d\u0430 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435    func makeSound() {}}print(MemoryLayout&lt;Small&gt;.size)   \/\/ 8print(MemoryLayout&lt;Medium&gt;.size)  \/\/ 24 \u2014 \u0442\u043e\u0447\u043d\u043e \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435print(MemoryLayout&lt;Big&gt;.size)     \/\/ 32 \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>Small<\/code> \u0438 <code>Medium<\/code> \u043b\u044f\u0433\u0443\u0442 inline. <code>Big<\/code> \u043f\u043e\u0439\u0434\u0451\u0442 \u0432 heap.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>inline<\/strong>, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>animal:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 small value bytes 0-7                  \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 small value bytes 8-15                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 small value bytes 16-23 (+padding)     \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 type metadata                        \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 witness table                        \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>\u0432 heap<\/strong>, \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0442 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c:<\/p>\n<pre><code>animal:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 \u2192 heap allocation                      \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 unused                                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 unused                                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 type metadata                        \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 witness table                        \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518heap:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 allocation header                      \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 actual big value                       \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 existential \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 <code>malloc<\/code>, \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 <code>free<\/code>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 overhead, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0434\u0451\u0442 \u0432 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435.<\/p>\n<p><strong>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438:<\/strong> \u00ab\u0415\u0441\u043b\u0438 \u0443 struct A 24 \u0431\u0430\u0439\u0442\u0430, \u0430 \u0443 struct B 25 \u0431\u0430\u0439\u0442, \u0438 \u043e\u0431\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 P, \u0435\u0441\u0442\u044c \u043b\u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043f\u0440\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0432 <code>any P<\/code>?\u00bb \u2014 \u0414\u0430, A \u043b\u044f\u0436\u0435\u0442 inline, B \u043f\u043e\u0439\u0434\u0451\u0442 \u0432 heap.<\/p>\n<hr\/>\n<h3>4. Type metadata: \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435<\/h3>\n<p>Type metadata \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043b\u0435\u0436\u0430\u0449\u0430\u044f \u0432 read-only \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430. \u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e Swift-\u0442\u0438\u043f\u0430. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0434\u043b\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430:<\/p>\n<ul>\n<li>\n<p><strong>Kind<\/strong> \u2014 class \/ struct \/ enum \/ tuple \/ function \/ protocol \/ metatype.<\/p>\n<\/li>\n<li>\n<p><strong>Size, alignment, stride<\/strong> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <strong>Value Witness Table<\/strong> (VWT).<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u043c\u044f \u0442\u0438\u043f\u0430<\/strong> (\u0434\u043b\u044f reflection \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438).<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 virtual table, isa-pointer \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 Objective-C.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432 \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0438\u043f\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 Existential Container\u2019\u0430, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ol>\n<li>\n<p>\u0427\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 metadata \u0438\u0437 slot 3.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0440\u0435\u0437 metadata \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 VWT.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0440\u0435\u0437 VWT \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f (<code>copy<\/code>, <code>destroy<\/code>, <code>move<\/code>).<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/p>\n<hr\/>\n<h3>5. Value Witness Table<\/h3>\n<p>VWT \u2014 \u044d\u0442\u043e, \u043f\u043e \u0441\u0443\u0442\u0438, \u00ab\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u00bb \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e:<\/p>\n<pre><code>VWT:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 ptr \u2192 destroy                              \u2502\u2502 ptr \u2192 initializeWithCopy                   \u2502\u2502 ptr \u2192 assignWithCopy                       \u2502\u2502 ptr \u2192 initializeWithTake                   \u2502\u2502 ptr \u2192 assignWithTake                       \u2502\u2502 size                                       \u2502\u2502 stride                                     \u2502\u2502 alignment mask                             \u2502\u2502 flags (isPOD, isBitwiseTakable, ...)       \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<p><code><strong>isBitwiseTakable<\/strong><\/code> \u2014 \u0444\u043b\u0430\u0433 \u00ab\u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>memcpy<\/code>\u00bb. \u0414\u043b\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (<code>Int<\/code>, <code>Double<\/code>, struct \u0438\u0437 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0431\u0435\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432) \u2014 true, \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 <code>memcpy<\/code>. \u0414\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0441 reference-\u043f\u043e\u043b\u044f\u043c\u0438 (\u043a\u043b\u0430\u0441\u0441\u044b \u0432\u043d\u0443\u0442\u0440\u0438, indirect enum cases) \u2014 false, \u043d\u0443\u0436\u0435\u043d \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441 retain\/release.<\/p>\n<p><code><strong>destroy<\/strong><\/code> \u2014 \u0434\u043b\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u044d\u0442\u043e no-op. \u0414\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>release<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c reference-\u043f\u043e\u043b\u0435.<\/p>\n<p><code><strong>initializeWithCopy<\/strong><\/code><strong> vs <\/strong><code><strong>assignWithCopy<\/strong><\/code> \u2014 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u043e\u043c, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u044b \u00ab\u0441\u0432\u0435\u0436\u0443\u044e\u00bb \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u043b\u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0432 \u0443\u0436\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e (\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c).<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e VWT \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 any-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u043e\u043b\u044c VWT: \u043e\u043d\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e concrete type.<\/p>\n<hr\/>\n<h3>6. Protocol Witness Table<\/h3>\n<p>PWT \u2014 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430.<\/p>\n<pre><code class=\"swift\">protocol Animal {    func makeSound()        \/\/ \u0441\u043b\u043e\u0442 0    func eat()              \/\/ \u0441\u043b\u043e\u0442 1    var name: String { get } \/\/ \u0441\u043b\u043e\u0442 2 (getter)}extension Dog: Animal {    func makeSound() { print(\"woof\") }    func eat() { print(\"eating\") }    var name: String { \"Rex\" }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>PWT \u0434\u043b\u044f \u043f\u0430\u0440\u044b <code>(Dog : Animal)<\/code>:<\/p>\n<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 ptr \u2192 Dog.makeSound             \u2502 \u0441\u043b\u043e\u0442 0\u2502 ptr \u2192 Dog.eat                   \u2502 \u0441\u043b\u043e\u0442 1\u2502 ptr \u2192 Dog.name.getter           \u2502 \u0441\u043b\u043e\u0442 2\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>PWT \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b (\u0442\u0438\u043f, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b). \u0415\u0441\u043b\u0438 <code>Dog<\/code> \u0435\u0449\u0451 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>CustomStringConvertible<\/code> \u2014 \u0443 \u043d\u0435\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f PWT \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u0430\u0440\u044b. \u0415\u0441\u043b\u0438 <code>Cat<\/code> \u0442\u043e\u0436\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>Animal<\/code> \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u0442\u0440\u0435\u0442\u044c\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a <code>(Dog : Animal)<\/code>.<\/p>\n<h4>\u0412\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: \u0447\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 PWT<\/h4>\n<p>\u0412 PWT \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 <strong>\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u044b, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 <\/strong><code><strong>protocol { }<\/strong><\/code>. \u041c\u0435\u0442\u043e\u0434\u044b \u0438\u0437 protocol extension, \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435, \u0432 PWT \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442.<\/p>\n<p>\u042d\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u043e\u0432\u0443\u0448\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u044e\u0431\u044f\u0442 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445:<\/p>\n<pre><code class=\"swift\">protocol P { func foo() }extension P {    func foo() { print(\"ext foo\") }    func bar() { print(\"ext bar\") }   \/\/ \u041d\u0415 \u0432 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430}struct S: P {    func foo() { print(\"S foo\") }    func bar() { print(\"S bar\") }}let p: any P = S()p.foo()  \/\/ \"S foo\"   \u2014 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 dispatch \u0447\u0435\u0440\u0435\u0437 PWTp.bar()  \/\/ \"ext bar\" \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 dispatch \u043f\u043e \u0442\u0438\u043f\u0443 P<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 <code>bar()<\/code> \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 <code>\"ext bar\"<\/code>, \u0430 \u043d\u0435 <code>\"S bar\"<\/code>? \u041c\u0435\u0442\u043e\u0434 <code>bar<\/code> \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 <code>P<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u043e\u0442\u0430 \u0432 PWT \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0435\u0442. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 dispatch \u2014 \u043d\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432. \u041e\u043d \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 (<code>any P<\/code>), \u0430 \u044d\u0442\u043e extension-\u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430.<\/p>\n<p>\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e: <strong>\u0432 PWT \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e \u0432 \u0441\u0430\u043c\u043e\u043c <\/strong><code><strong>protocol { }<\/strong><\/code>.<\/p>\n<hr\/>\n<h3>7. \u041f\u043e\u043b\u043d\u044b\u0439 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b existential container<\/h3>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u043c <code>any Animal<\/code>.<\/p>\n<pre><code class=\"swift\">protocol Animal { func makeSound() }struct Dog: Animal {    let name: String    func makeSound() { print(\"\\(name): Woof!\") }}let animal: any Animal = Dog(name: \"Rex\")animal.makeSound()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 1: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/h4>\n<pre><code class=\"swift\">let animal: any Animal = Dog(name: \"Rex\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f <code>Dog(name: \"Rex\")<\/code> \u043a\u0430\u043a struct. \u0420\u0430\u0437\u043c\u0435\u0440 \u2014 16 \u0431\u0430\u0439\u0442 (<code>String<\/code> \u2014 \u0434\u0432\u0430 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432\u0430: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c + length+flags).<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 Existential Container \u2014 40 \u0431\u0430\u0439\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 <code>Dog<\/code> (16 \u0431\u0430\u0439\u0442) \u2264 24 \u2192 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f inline \u0432 buffer.<\/p>\n<\/li>\n<li>\n<p>\u0412 slot type metadata \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>Dog.Type<\/code> metadata.<\/p>\n<\/li>\n<li>\n<p>\u0412 slot witness table \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 PWT <code>(Dog : Animal)<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<pre><code>animal (40 \u0431\u0430\u0439\u0442):\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 \"Rex\" string pointer                   \u2502 \u2190 Dog.name pointer\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \"Rex\" length+flags                     \u2502 \u2190 Dog.name discriminator\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 unused                                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 Dog.Type metadata                    \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 PWT (Dog : Animal)                   \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 2: \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430<\/h4>\n<pre><code class=\"swift\">animal.makeSound()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u043d\u0430\u0435\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0447\u0442\u043e <code>makeSound()<\/code> \u2014 \u044d\u0442\u043e \u0441\u043b\u043e\u0442 0 \u0432 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 <code>Animal<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u043d\u0442\u0430\u0439\u043c \u0447\u0438\u0442\u0430\u0435\u0442 PWT \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043b\u043e\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 0 \u0432 PWT \u0431\u0435\u0440\u0451\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u2192 \u044d\u0442\u043e <code>Dog.makeSound<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 self (\u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e inline buffer) \u043a\u0430\u043a \u043d\u0435\u044f\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.<\/p>\n<\/li>\n<li>\n<p>Indirect call \u043f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u043d\u0434\u0438\u0440\u0435\u043a\u0446\u0438\u0438 (\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2192 PWT, PWT \u2192 \u043c\u0435\u0442\u043e\u0434) \u0438 indirect call. Indirect call \u043f\u043b\u043e\u0445\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u043c branch predictor\u2019\u043e\u043c \u2014 pipeline \u0441\u0442\u043e\u043f\u043e\u0440\u0438\u0442\u0441\u044f.<\/p>\n<h4>\u0428\u0430\u0433 3: \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/h4>\n<pre><code class=\"swift\">let copy = animal<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2014 \u044d\u0442\u043e value type. \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <strong>\u0447\u0435\u0440\u0435\u0437 VWT<\/strong>:<\/p>\n<ol>\n<li>\n<p>\u0420\u0430\u043d\u0442\u0430\u0439\u043c \u0447\u0438\u0442\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 metadata.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0440\u0435\u0437 metadata \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 VWT.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>VWT.initializeWithCopy(into: &amp;copy.buffer, from: &amp;animal.buffer, metadata)<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f <code>Dog<\/code> \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f String \u2014 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f refcount \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 metadata \u0438 PWT \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f (\u043e\u043d\u0438 const).<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 existential \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 VWT, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f. \u0414\u043b\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e <code>memcpy<\/code>. \u0414\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0441 reference-\u043f\u043e\u043b\u044f\u043c\u0438 \u2014 \u043d\u0443\u0436\u043d\u044b retain\/release \u0432\u044b\u0437\u043e\u0432\u044b.<\/p>\n<h4>\u0428\u0430\u0433 4: \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 <code>animal<\/code> \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 scope:<\/p>\n<ol>\n<li>\n<p>\u0420\u0430\u043d\u0442\u0430\u0439\u043c \u0447\u0438\u0442\u0430\u0435\u0442 metadata.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0440\u0435\u0437 VWT \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>destroy<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f <code>Dog<\/code> \u044d\u0442\u043e release \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h3>8. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0442\u0438\u043f\u044b \u0438 heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f inline:<\/p>\n<pre><code class=\"swift\">struct BigData: Animal {    let a: Int    let b: Int    let c: Int    let d: Int   \/\/ \u0438\u0442\u043e\u0433\u043e 32 \u0431\u0430\u0439\u0442\u0430    func makeSound() { print(\"big\") }}let animal: any Animal = BigData(a: 1, b: 2, c: 3, d: 4)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c <code>sizeof(BigData) = 32 &gt; 24<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 heap:<\/p>\n<pre><code>animal (40 \u0431\u0430\u0439\u0442, \u043d\u0430 \u0441\u0442\u0435\u043a\u0435):\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 \u2192 BigData on heap                      \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 unused                                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 unused                                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 BigData.Type metadata                \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 PWT (BigData : Animal)               \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518heap:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 allocation header (~16 bytes)          \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 a: 1, b: 2, c: 3, d: 4 (32 bytes)      \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u0430 value-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430: \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u0435\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 heap-\u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0438\u0442 \u043b\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 value-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 (\u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442)?<\/p>\n<p>\u041d\u0435\u0442, \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0438\u0442. \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f, <code>VWT.initializeWithCopy<\/code> \u0434\u043b\u044f <code>BigData<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 <strong>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e<\/strong> heap-\u043a\u043e\u043f\u0438\u044e. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u2014 \u0441\u0432\u043e\u044f heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f. Value-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f, \u043d\u043e \u0446\u0435\u043d\u043e\u0439 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0412 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 Swift \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441 opaque value buffers, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c copy-on-write \u0434\u043b\u044f existential container. \u041d\u043e \u0434\u0435\u0442\u0430\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e.<\/p>\n<hr\/>\n<h3>9. Protocol composition: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e witness tables<\/h3>\n<pre><code class=\"swift\">let value: any Hashable &amp; CustomStringConvertible = \"hello\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043a\u043e\u043b\u044c\u043a\u043e witness tables \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435? \u0414\u0432\u0435 \u2014 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0440\u0430\u0441\u0442\u0451\u0442:<\/p>\n<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 Inline buffer (24 \u0431\u0430\u0439\u0442\u0430)                   \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Type metadata                              \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 PWT (String : Hashable)                    \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 PWT (String : CustomStringConvertible)     \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0442\u043e\u0433\u043e 6 \u0441\u043b\u043e\u0432 = 48 \u0431\u0430\u0439\u0442. \u0414\u043b\u044f \u0442\u0440\u0451\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u2014 7 \u0441\u043b\u043e\u0432. \u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u0435\u043d \u0447\u0438\u0441\u043b\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0432 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 witness table \u0431\u0440\u0430\u0442\u044c \u2014 \u043e\u043d \u0437\u043d\u0430\u0435\u0442, \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434. \u0415\u0441\u043b\u0438 \u0438\u0437 <code>Hashable<\/code> \u2014 PWT1, \u0435\u0441\u043b\u0438 \u0438\u0437 <code>CustomStringConvertible<\/code> \u2014 PWT2.<\/p>\n<hr\/>\n<h3>10. Class-only protocols: \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 <code>AnyObject<\/code> (\u0442\u043e \u0435\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f class-only), \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441. Inline buffer \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u2014 \u0441\u0441\u044b\u043b\u043a\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0432\u043e.<\/p>\n<pre><code class=\"swift\">protocol Worker: AnyObject {    func work()}class Employee: Worker { func work() { print(\"working\") } }let worker: any Worker = Employee()print(MemoryLayout&lt;any Worker&gt;.size)  \/\/ 16, \u043d\u0435 40<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Class Existential Container \u2014 \u0432\u0441\u0435\u0433\u043e <strong>2 \u0441\u043b\u043e\u0432\u0430<\/strong> \u043d\u0430 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435:<\/p>\n<pre><code>worker:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 \u2192 Employee object reference        \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 PWT (Employee : Worker)          \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Type metadata \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c \u2014 \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0447\u0435\u0440\u0435\u0437 isa-pointer \u043a\u043b\u0430\u0441\u0441\u0430). Inline buffer \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u2014 \u0441\u0441\u044b\u043b\u043a\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0432\u043e.<\/p>\n<p>\u042d\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435 opaque-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435: \u043d\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 inline-vs-heap, \u043d\u0435\u0442 heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0436\u0435 \u043d\u0430 heap \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441).<\/p>\n<p><strong>\u0414\u043b\u044f \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f:<\/strong> \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 conforming-\u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043a\u043b\u0430\u0441\u0441\u044b, \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u044f\u0432\u043d\u043e \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043e\u0442 <code>AnyObject<\/code>. \u042d\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 Existential Container\u2019\u0430 \u0441 40 \u0434\u043e 16 \u0431\u0430\u0439\u0442 \u0438 \u0443\u0431\u0435\u0440\u0451\u0442 overhead \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"swift\">protocol DataSource { ... }              \/\/ 40 \u0431\u0430\u0439\u0442 \u0432 any DataSourceprotocol DataSource: AnyObject { ... }   \/\/ 16 \u0431\u0430\u0439\u0442 \u0432 any DataSource<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<hr\/>\n<h3>11. \u041e\u0441\u043e\u0431\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u0442\u0438\u043f Error<\/h3>\n<p>\u0422\u0438\u043f <code>Error<\/code> \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e existential, \u0444\u043e\u0440\u043c\u0430\u0442:<\/p>\n<pre><code class=\"swift\">let err: Error = MyError.somethingprint(MemoryLayout&lt;Error&gt;.size)  \/\/ 8<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0434\u0438\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c:<\/p>\n<pre><code>err:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 \u2192 ErrorObject on heap              \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518heap:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 refcount header                    \u2502\u2502 \u2192 ErrorType metadata               \u2502\u2502 \u2192 PWT for Error                    \u2502\u2502 actual error value                 \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a:<\/p>\n<ol>\n<li>\n<p><strong>Bridging \u0441 NSError.<\/strong> <code>NSError<\/code> \u2014 \u044d\u0442\u043e Objective-C \u043a\u043b\u0430\u0441\u0441. \u0427\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 Swift <code>Error<\/code> \u0438 <code>NSError<\/code> \u0431\u044b\u043b\u0430 \u0434\u0435\u0448\u0451\u0432\u043e\u0439, Swift <code>Error<\/code> \u0442\u043e\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u00ab\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>Errors \u0447\u0430\u0441\u0442\u043e \u0431\u0440\u043e\u0441\u0430\u044e\u0442\u0441\u044f.<\/strong> \u041f\u0440\u0438 <code>try<\/code>-\u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c error \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u043e \u0441\u0442\u0435\u043a\u0443. \u041e\u0434\u0438\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>Errors \u0447\u0430\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u0445<\/strong> (\u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0448\u0438\u0431\u043e\u043a, \u0441\u043b\u043e\u0432\u0430\u0440\u0438 error-handlers). \u041e\u0434\u0438\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435: \u043a\u0430\u0436\u0434\u044b\u0439 <code>throw<\/code> \u2014 \u044d\u0442\u043e heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f. \u041d\u0430 \u043f\u0443\u0442\u044f\u0445 \u0441 \u0447\u0430\u0441\u0442\u044b\u043c\u0438 try\/catch \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0432 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0435.<\/p>\n<p>\u0412 Swift 6 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c <strong>typed throws<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u043c\u043e\u0433\u0443\u0442 \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c:<\/p>\n<pre><code class=\"swift\">func parse() throws(ParseError) -&gt; Result { ... }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 value type, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438.<\/p>\n<hr\/>\n<h3>12. Protocol with Associated Types \u0438 existentials<\/h3>\n<p>\u0414\u043e Swift 5.7 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"swift\">let h: any Hashable = 5            \/\/ \u274c \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e 5.7let array: [any Equatable] = []    \/\/ \u274c \u0442\u043e\u0436\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430: <code>Hashable<\/code> \u0438 <code>Equatable<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0441 <code>Self<\/code>-requirements. \u0423 \u043d\u0438\u0445 \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 <code>==<\/code> \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 <code>Self<\/code>:<\/p>\n<pre><code class=\"swift\">public protocol Equatable {    static func == (lhs: Self, rhs: Self) -&gt; Bool}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Existential Container \u043d\u0435 \u0443\u043c\u0435\u043b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 Self\u00bb \u2014 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0431\u044b \u0437\u043d\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0422\u043e \u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f Protocol with Associated Types: \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f, \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e, \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0421 Swift 5.7 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c:<\/p>\n<p><strong>1. Protocol with Associated Types \u0438 <\/strong><code><strong>Self<\/strong><\/code><strong>-requirement \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <\/strong><code><strong>any<\/strong><\/code><strong>:<\/strong><\/p>\n<pre><code class=\"swift\">let array: [any Hashable] = [1, \"hello\", true]   \/\/ OKlet h: any Hashable = 5                           \/\/ OK<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e existential \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u2014 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430\u0445. \u041d\u043e \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 existential.<\/p>\n<p><strong>2. Implicit opening of existentials.<\/strong> \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u00ab\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u00bb any \u0432 generic-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0432 generic-\u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"swift\">func use&lt;T: Hashable&gt;(_ value: T) {    var hasher = Hasher()    value.hash(into: &amp;hasher)}let h: any Hashable = 5use(h)   \/\/ Swift 5.7+: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 any \u0432 T.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e Swift 5.7 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 <code>as?<\/code>:<\/p>\n<pre><code class=\"swift\">if let h = h as? Int { use(h) }else if let h = h as? String { use(h) }\/\/ \u2014 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u0438\u043f\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Implicit opening \u2014 \u044d\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0430 \u043d\u0435 runtime-\u043c\u0430\u0433\u0438\u044f. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0430\u0451\u0442 type metadata \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0438\u043b\u0438 generic \u0432\u0435\u0440\u0441\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p><strong>\u041e\u0434\u043d\u0430\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f.<\/strong> \u041d\u0435 \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 <code>any Hashable<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e:<\/p>\n<pre><code class=\"swift\">let h: any Hashable = 5h.hash(into: &amp;hasher)   \/\/ \u274c \u043d\u0435\u043b\u044c\u0437\u044f \u2014 inout self \u0441 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0432 generic-\u0444\u0443\u043d\u043a\u0446\u0438\u044e (implicit opening), \u043b\u0438\u0431\u043e downcast \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443.<\/p>\n<hr\/>\n<h3>13. \u0427\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u0432 lldb<\/h3>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<pre><code class=\"swift\">let animal: any Animal = Dog(name: \"Rex\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 lldb:<\/p>\n<pre><code>(lldb) po animalDog(name: \"Rex\")(lldb) p animal(Animal) animal = (payload_data_0 = ..., payload_data_1 = ...,                    payload_data_2 = 0, metadata = 0x100008f70,                    wtable = 0x100008fa8)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0438\u0434\u043d\u043e 5 \u043f\u043e\u043b\u0435\u0439 <code>payload_data_X<\/code> \u2014 \u044d\u0442\u043e \u0441\u043b\u043e\u0442\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. <code>metadata<\/code> \u0438 <code>wtable<\/code> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 type metadata \u0438 Protocol Witness Table.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c metadata:<\/p>\n<pre><code>(lldb) image lookup -a 0x100008f70<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043a\u0430\u0436\u0435\u0442, \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f metadata \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.<\/p>\n<hr\/>\n<h3>14. \u0427\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u0432 SIL<\/h3>\n<p>SIL (Swift Intermediate Language) \u2014 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0430\u0448 \u043a\u043e\u0434 \u043f\u0435\u0440\u0435\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 LLVM IR. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 existential.<\/p>\n<pre><code class=\"bash\">swiftc -emit-sil file.swift &gt; out.sil<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432 SIL \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"swift\">%container = alloc_stack $Animal%addr = init_existential_addr %container : $*Animal, $Dogstore %dog to %addr : $*Dog\/\/ \u0414\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430:%opened = open_existential_addr immutable_access %container : $*Animal                                 to $*@opened(\"UUID\") Animal%method = witness_method $@opened(\"UUID\") Animal, #Animal.makeSound : ...%result = apply %method&lt;@opened(\"UUID\") Animal&gt;(%opened)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code><strong>init_existential_addr<\/strong><\/code> \u2014 \u00ab\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439 Existential Container \u0442\u0438\u043f\u043e\u043c X\u00bb. \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 metadata \u0438 witness table \u0441\u043b\u043e\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p><code><strong>open_existential_addr<\/strong><\/code> \u2014 \u00ab\u043e\u0442\u043a\u0440\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043f\u043e\u043b\u0443\u0447\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043d\u0430 opaque-\u0442\u0438\u043f\u00bb. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p><code><strong>witness_method<\/strong><\/code> \u2014 \u00ab\u0434\u043e\u0441\u0442\u0430\u043d\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0437 witness table \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u00bb.<\/p>\n<\/li>\n<li>\n<p><code><strong>apply<\/strong><\/code> \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f <code>init_existential<\/code> \/ <code>open_existential<\/code> \/ <code>witness_method<\/code> \u2014 \u044d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b, \u0447\u0442\u043e \u043a\u043e\u0434 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 existentials, \u0438 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043d\u0430 generic \u0438\u043b\u0438 opaque types.<\/p>\n<hr\/>\n<h3>15. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438<\/h3>\n<h4>\u0422\u0438\u043f Any<\/h4>\n<p><code>Any<\/code> \u2014 \u0442\u043e\u0436\u0435 existential, \u043d\u043e <strong>\u0431\u0435\u0437 requirement\u2019\u043e\u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430<\/strong>. \u0422\u043e\u043b\u044c\u043a\u043e type metadata + inline buffer:<\/p>\n<pre><code class=\"swift\">print(MemoryLayout&lt;Any&gt;.size)  \/\/ 32 (4 \u0441\u043b\u043e\u0432\u0430: 3 buffer + 1 metadata)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Witness tables \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u2014 \u043d\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c. \u0421 <code>Any<\/code> \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>as?<\/code> cast \u0438\u043b\u0438 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>Mirror<\/code>.<\/p>\n<h4>Generic \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/h4>\n<pre><code class=\"swift\">func process&lt;T: Animal&gt;(_ animal: T) { ... }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 <code>any P<\/code>, generic-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Existential Container<\/strong>. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043b\u0438\u0431\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 <code>T<\/code> (generic specialization \u043f\u0440\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438), \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 type metadata \u0438 witness table \u043a\u0430\u043a \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0435\u0442 inline-vs-heap \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u043d\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 VWT.<\/p>\n<h4>Opaque types (some P)<\/h4>\n<pre><code class=\"swift\">func makeAnimal() -&gt; some Animal { Dog() }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>some P<\/code> \u2014 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Existential Container. \u042d\u0442\u043e <strong>opaque-\u0442\u0438\u043f<\/strong>: \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0441\u043a\u0440\u044b\u0442 \u043e\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e, \u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443. \u041f\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0438 \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441\u0443 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d generic-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443.<\/p>\n<h4>Type erasure \u0447\u0435\u0440\u0435\u0437 wrapper<\/h4>\n<pre><code class=\"swift\">struct AnyAnimal { ... }let array: [AnyAnimal] = [...]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Type erasure \u2014 \u044d\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 (\u043e\u0431\u044b\u0447\u043d\u043e \u0447\u0435\u0440\u0435\u0437 box pattern \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0438\u043b\u0438 closures), \u0441\u0442\u0438\u0440\u0430\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f. \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Existential Container, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u0438\u0434\u0435\u044e \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438. \u0427\u0430\u0441\u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u043a\u0430\u043a \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0443 <code>any P<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 API \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u0451\u0440\u0442\u043a\u0438.<\/p>\n<h4>Bridging \u0441 Objective-C<\/h4>\n<p><code>NSArray<\/code> \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u2014 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 <code>id<\/code>, \u0433\u0434\u0435 <code>id<\/code> \u2248 <code>AnyObject<\/code>. \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0441\u0442:<\/p>\n<pre><code class=\"swift\">let arr = someNSArray as [Any]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 Swift Existential Container. \u042d\u0442\u043e O(n) \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<hr\/>\n<h3>16. \u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c any P<\/h3>\n<p>\u041d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043d\u043e \u0438 <strong>\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f<\/strong>.<\/p>\n<h4>\u0421\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 any P \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d<\/h4>\n<ul>\n<li>\n<p><strong>\u0413\u0435\u0442\u0435\u0440\u043e\u0433\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438:<\/strong> <code>[any View]<\/code>, <code>[any Animal]<\/code>. \u0411\u0435\u0437 any \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0435 \u0440\u0435\u0448\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>API-\u0433\u0440\u0430\u043d\u0438\u0446\u044b<\/strong>, \u0433\u0434\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u0430\u0436\u0435\u043d.<\/p>\n<\/li>\n<li>\n<p><strong>Type erasure \u0434\u043b\u044f \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b<\/strong>, \u0433\u0434\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0421\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 any P \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c<\/h4>\n<ul>\n<li>\n<p><strong>\u0427\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/strong> Witness table dispatch \u2014 \u044d\u0442\u043e indirect call, \u043f\u043b\u043e\u0445\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0435 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442\u0441\u044f. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043b\u0443\u0447\u0448\u0435 generic \u0441 <code>&lt;T:&gt;<\/code> \u0438\u043b\u0438 opaque-\u0442\u0438\u043f <code>some P<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Conforming-\u0442\u0438\u043f\u044b \u0431\u043e\u043b\u044c\u0448\u0435 24 \u0431\u0430\u0439\u0442 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 <\/strong><code><strong>any P<\/strong><\/code><strong>.<\/strong> \u041a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f. \u041d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0438\u043f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0434\u0438\u043d \u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d.<\/strong> \u0422\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0437\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u2014 generic \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 direct call.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 existential \u0443\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f<\/h4>\n<ol>\n<li>\n<p><strong>Class-only protocols<\/strong> (<code>protocol P: AnyObject<\/code>). \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043e 2 \u0441\u043b\u043e\u0432 \u0438 \u0443\u0431\u0438\u0440\u0430\u044e\u0442 inline-vs-heap \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0435\u043b\u0430\u0442\u044c conforming-\u0442\u0438\u043f\u044b \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 24 \u0431\u0430\u0439\u0442.<\/strong> \u0422\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f inline, \u0431\u0435\u0437 heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><code><strong>@frozen<\/strong><\/code> \u0434\u043b\u044f conforming-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 (\u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u0441 library evolution). \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 layout \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c implicit opening<\/strong> (Swift 5.7+) \u0438 \u043f\u0438\u0441\u0430\u0442\u044c generic-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u043d\u0438\u0445 existential \u2014 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u043e\u0442\u043a\u0440\u043e\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>Typed throws<\/strong> \u0434\u043b\u044f error-\u0442\u0438\u043f\u043e\u0432 (Swift 6+).<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h3>17. \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438<\/h3>\n<p>\u0421\u0432\u043e\u0434 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0433\u043e\u043d\u044f\u044e\u0442 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435:<\/p>\n<p><strong>\u00ab\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Existential Container?\u00bb<\/strong> \u2014 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443\u00bb. \u0421\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 inline buffer + type metadata + witness table(s).<\/p>\n<p><strong>\u00ab\u041a\u0430\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 opaque existential \u043d\u0430 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435?\u00bb<\/strong> \u2014 5 \u0441\u043b\u043e\u0432 = 40 \u0431\u0430\u0439\u0442.<\/p>\n<p><strong>\u00ab\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 <\/strong><code><strong>any P<\/strong><\/code><strong> struct \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 32 \u0431\u0430\u0439\u0442\u0430?\u00bb<\/strong> \u2014 \u0411\u0443\u0434\u0435\u0442 heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f (&gt;24 \u0431\u0430\u0439\u0442). \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u2192 malloc\/free.<\/p>\n<p><strong>\u00ab\u0427\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f class-only existential?\u00bb<\/strong> \u2014 2 \u0441\u043b\u043e\u0432\u0430: object reference + witness table. Inline buffer \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, type metadata \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 isa-pointer \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p><strong>\u00ab\u041f\u043e\u0447\u0435\u043c\u0443 <\/strong><code><strong>Error<\/strong><\/code><strong> \u2014 \u043e\u0441\u043e\u0431\u044b\u0439?\u00bb<\/strong> \u2014 \u0423 \u043d\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442: \u043e\u0434\u0438\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 heap-error-box. \u041e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 bridging \u0441 NSError \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u044b try\/catch.<\/p>\n<p><strong>\u00ab\u041a\u043e\u0433\u0434\u0430 <\/strong><code><strong>any P<\/strong><\/code><strong> \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 <\/strong><code><strong>&lt;T: P&gt;<\/strong><\/code><strong>?\u00bb<\/strong> \u2014 \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430. <code>any<\/code> \u2014 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 dispatch \u0447\u0435\u0440\u0435\u0437 witness table + \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 boxing. Generic \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u2014 direct call \u0441 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u043e\u043c.<\/p>\n<p><strong>\u00ab\u041a\u0430\u043a\u043e\u0439 dispatch \u0443 \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u0437 protocol extension, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435?\u00bb<\/strong> \u2014 \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u043f\u043e \u0442\u0438\u043f\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. Override \u0432 conforming-\u0442\u0438\u043f\u0435 \u0432\u0438\u0434\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f, \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 <code>any P<\/code>.<\/p>\n<p><strong>\u00ab\u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u043e Swift 5.7 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Protocol with Associated Types \u043a\u0430\u043a existential?\u00bb<\/strong> \u2014 Existential Container \u043d\u0435 \u043c\u043e\u0433 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0438\u043b\u0438 Self-requirements: \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0437\u043d\u0430\u043b \u0431\u044b, \u043a\u0430\u043a \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0438\u043f\u044b \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u0445 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c.<\/p>\n<p><strong>\u00ab\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 implicit opening of existentials?\u00bb<\/strong> \u2014 \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 any \u0432 generic-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0432 generic-\u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0432 Swift 5.7. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<\/p>\n<p><strong>\u00ab\u041a\u0430\u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c overhead <\/strong><code><strong>any P<\/strong><\/code><strong>?\u00bb<\/strong> \u2014 \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b class-only (<code>: AnyObject<\/code>), \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c conforming-\u0442\u0438\u043f\u044b \u0434\u043e 24 \u0431\u0430\u0439\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>@frozen<\/code> \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u0441 library evolution, \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 generic \u0432 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435.<\/p>\n<hr\/>\n<h3>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.swift.org\/swift-book\/documentation\/the-swift-programming-language\/protocols\/#Existential-Type\" rel=\"noopener noreferrer nofollow\">Swift Language Reference: Existential Types<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/main\/proposals\/0309-unlock-existential-types-for-all-protocols.md\" rel=\"noopener noreferrer nofollow\">SE-0309: Unlock existentials for all protocols<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/main\/proposals\/0335-existential-any.md\" rel=\"noopener noreferrer nofollow\">SE-0335: Introduce existential <code>any<\/code><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/main\/proposals\/0352-implicit-open-existentials.md\" rel=\"noopener noreferrer nofollow\">SE-0352: Implicitly Opened Existentials<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2022\/110352\/\" rel=\"noopener noreferrer nofollow\">WWDC 2022: Embrace Swift generics<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2022\/110353\/\" rel=\"noopener noreferrer nofollow\">WWDC 2022: Design protocol interfaces in Swift<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/apple\/swift\/blob\/main\/stdlib\/public\/runtime\/ExistentialContainer.h\" rel=\"noopener noreferrer nofollow\">Swift Runtime: ExistentialContainer source<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/apple\/swift\/blob\/main\/docs\/ABIStabilityManifesto.md\" rel=\"noopener noreferrer nofollow\">Swift ABI Stability Manifesto<\/a><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0422\u0435\u0433\u0438:<\/strong> swift, ios development, performance, protocols, generics, interview<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1043692\/\">https:\/\/habr.com\/ru\/articles\/1043692\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Existential Container \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u0435\u0445 \u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043d\u0430 middle \u0438 senior iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0415\u0441\u043b\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c layout \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043f\u0440\u043e\u0449\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043c: any vs some, Protocol with Associated Types, type erasure \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c protocol dispatch.\u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438.\u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430: 15 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Existential Container?\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0442\u0438\u043f\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443\u00bb. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f any P (\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e P \u0434\u043e Swift 5.6).\u041a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0443 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e Existential Container \u043d\u0430 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435?40 \u0431\u0430\u0439\u0442 (5 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u043f\u043e 8 \u0431\u0430\u0439\u0442 \u043a\u0430\u0436\u0434\u043e\u0435).\u0418\u0437 \u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440?\u0422\u0440\u0438 \u0441\u043b\u043e\u0442\u0430 inline buffer (24 \u0431\u0430\u0439\u0442\u0430) + \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 type metadata + \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 Protocol Witness Table. \u0418\u0442\u043e\u0433\u043e \u2014 5 \u0441\u043b\u043e\u0432.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 inline buffer \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d?\u042d\u0442\u043e \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 24 \u0431\u0430\u0439\u0442\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f inline-\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0442\u0443\u0434\u0430 \u0432\u043b\u0435\u0437\u0430\u0435\u0442. \u041f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 24 \u0431\u0430\u0439\u0442?\u0411\u0443\u0434\u0435\u0442 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 heap, \u0430 \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0442 inline buffer \u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u0442\u0443 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e. \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 malloc \/ free.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 type metadata?\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0442\u0438\u043f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435: kind (class\/struct\/enum), size, alignment, \u0438\u043c\u044f, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 Value Witness Table. \u041b\u0435\u0436\u0438\u0442 \u0432 read-only \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Value Witness Table (VWT)?\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c: copy, destroy, move, assign. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430: \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Protocol Witness Table (PWT)?\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b (\u0442\u0438\u043f, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 existential.\u0427\u0435\u043c \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 PWT \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430?Indirect call \u0445\u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u0438 \u043c\u0435\u0448\u0430\u0435\u0442 \u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0435\u043c direct call.\u041a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f protocol composition (any P1 &amp; P2)?\u0420\u0430\u0441\u0442\u0451\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e: \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0432\u043e (\u043f\u043e\u0434 Protocol Witness Table). any P1 &amp; P2 \u2014 6 \u0441\u043b\u043e\u0432, any P1 &amp; P2 &amp; P3 \u2014 7 \u0441\u043b\u043e\u0432 \u0438 \u0442.\u0434.\u0427\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0443 class-only \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 (protocol P: AnyObject)?\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u0438\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435 \u2014 \u0432\u0441\u0435\u0433\u043e 2 \u0441\u043b\u043e\u0432\u0430 (16 \u0431\u0430\u0439\u0442): \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 + \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 PWT. Inline buffer \u0438 type metadata \u043d\u0435 \u043d\u0443\u0436\u043d\u044b: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 metadata \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 isa-pointer \u043a\u043b\u0430\u0441\u0441\u0430.\u0427\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0443 \u0442\u0438\u043f\u0430 Error?\u0423 Error \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442: \u043e\u0434\u0438\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 heap-\u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u00aberror box\u00bb. \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f bridging \u0441 NSError \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u044b try\/catch. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 error \u2014 \u044d\u0442\u043e heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f.\u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u043e Swift 5.7 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Hashable \u0438 Protocol with Associated Types \u043a\u0430\u043a existential?\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0438\u0445 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u0445 \u0435\u0441\u0442\u044c Self \u0438\u043b\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435 \u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445, \u0433\u0434\u0435 \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 Self \u0438\u043b\u0438 associated type. \u0423 existential \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0435\u0433\u043e dynamic type, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.\u0427\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0432 Swift 5.7?\u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c any Hashable, any Equatable \u0438 \u0442. \u043f. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c implicit opening \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u00ab\u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435\u00bb existential \u0432 generic-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0432 generic-\u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u042d\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u043d\u0435 runtime-\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430.\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c any P?\u0412 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 (witness table dispatch \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 direct call); \u0434\u043b\u044f conforming-\u0442\u0438\u043f\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 24 \u0431\u0430\u0439\u0442 (heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438); \u043a\u043e\u0433\u0434\u0430 \u0442\u0438\u043f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0434\u0438\u043d \u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u2014 \u0442\u0430\u043c \u043b\u0443\u0447\u0448\u0435 generic \u0438\u043b\u0438 some.\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u04401. \u041a\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 Existential Container\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442:protocol Animal {    func makeSound()}struct Dog: Animal {    let name: String    func makeSound() { print(&#171;\\(name): Woof!&#187;) }}struct Cat: Animal {    let mood: String    let age: Int    func makeSound() { print(&#171;Meow&#187;) }}struct Whale: Animal {    let location: GPSCoordinate    let dna: [DNASegment]   \/\/ \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432    func makeSound() { print(&#171;&#8230;&#187;) }}\u0420\u0430\u0437\u043c\u0435\u0440\u044b \u0443 \u043d\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0435: \u0443 Dog \u2014 16 \u0431\u0430\u0439\u0442, \u0443 Cat \u2014 24, \u0443 Whale \u2014 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442. \u041d\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:let animal: any Animal = Dog(&#8230;)let animals: [any Animal] = [Dog(&#8230;), Cat(&#8230;), Whale(&#8230;)]\u0422\u043e \u0435\u0441\u0442\u044c \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 Animal. \u0422\u0438\u043f any Animal \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 (\u0438\u043d\u0430\u0447\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c), \u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f:\u0412\u0441\u0435\u0433\u0434\u0430 \u043a\u043b\u0430\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 heap, \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u041a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 heap-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u0434\u043e\u0440\u043e\u0433\u043e \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432.\u0420\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0443\u0444\u0435\u0440. \u0420\u0430\u0441\u0442\u043e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438.\u0413\u0438\u0431\u0440\u0438\u0434: \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 inline, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u2014 \u0432 heap.Swift \u0432\u044b\u0431\u0440\u0430\u043b \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0445\u0440\u0430\u043d\u0438\u0442\u044c:\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0438\u043f\u0435 (\u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u2014 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c).\u0422\u0430\u0431\u043b\u0438\u0446\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 (\u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 animal.makeSound()).2. \u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f opaque Existential Container\u0411\u0430\u0437\u043e\u0432\u044b\u0439 (\u00abopaque\u00bb) Existential Container \u043d\u0430 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 5 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c 40 \u0431\u0430\u0439\u0442:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 Slot 0  \u2502 Inline buffer word 0                   \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Slot 1  \u2502 Inline buffer word 1                   \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Slot 2  \u2502 Inline buffer word 2                   \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Slot 3  \u2502 Type metadata pointer                  \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 Slot 4  \u2502 Witness table pointer                  \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u041a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435:Slots 0\u20132 (24 \u0431\u0430\u0439\u0442\u0430) \u2014 inline buffer. \u0421\u044e\u0434\u0430 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0432\u043b\u0435\u0437\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 heap-\u043a\u043e\u043f\u0438\u044e.Slot 3 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 type metadata \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0438.Slot 4 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 Protocol Witness Table \u0434\u043b\u044f \u043f\u0430\u0440\u044b (\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b).\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435:print(MemoryLayout&lt;any Animal&gt;.size)  \/\/ 40\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043b\u0435\u0436\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438. \u041b\u044e\u0431\u043e\u0439 any Animal \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 40 \u0431\u0430\u0439\u0442. \u042d\u0442\u043e \u00ab\u0435\u0434\u0438\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u00bb, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.3. \u0413\u0440\u0430\u043d\u0438\u0446\u0430 24 \u0431\u0430\u0439\u0442\u0430: inline vs heap\u0420\u0430\u0437\u043c\u0435\u0440 inline buffer\u2019\u0430 \u2014 24 \u0431\u0430\u0439\u0442\u0430. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0451\u043c \u2014 \u043e\u043d\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f inline. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 heap.struct Small: Animal {    let x: Int   \/\/ 8 \u0431\u0430\u0439\u0442    func makeSound() {}}struct Medium: Animal {    let x: Int   \/\/ 8    let y: Int   \/\/ 8    let z: Int   \/\/ 8    func makeSound() {}}struct Big: Animal {    let x: Int   \/\/ 8    let y: Int   \/\/ 8    let z: Int   \/\/ 8    let w: Int   \/\/ 8 \u2014 \u043d\u0430 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435    func makeSound() {}}print(MemoryLayout&lt;Small&gt;.size)   \/\/ 8print(MemoryLayout&lt;Medium&gt;.size)  \/\/ 24 \u2014 \u0442\u043e\u0447\u043d\u043e \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435print(MemoryLayout&lt;Big&gt;.size)     \/\/ 32 \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044bSmall \u0438 Medium \u043b\u044f\u0433\u0443\u0442 inline. Big \u043f\u043e\u0439\u0434\u0451\u0442 \u0432 heap.\u041a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 inline, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:animal:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 small value bytes 0-7                  \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 small value bytes 8-15                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 small value bytes 16-23 (+padding)     \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 type metadata                        \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 witness table                        \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u041a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 heap, \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0442 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c:animal:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 \u2192 heap allocation                      \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 unused                                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 unused                                 \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 type metadata                        \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 \u2192 witness table                        \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518heap:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 allocation header                      \u2502\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u2502 actual big value                       \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 existential \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 malloc, \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 free. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 overhead, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0434\u0451\u0442 \u0432 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435.\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438: \u00ab\u0415\u0441\u043b\u0438 \u0443 struct A 24 \u0431\u0430\u0439\u0442\u0430, \u0430 \u0443 struct B 25 \u0431\u0430\u0439\u0442, \u0438 \u043e\u0431\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 P, \u0435\u0441\u0442\u044c \u043b\u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043f\u0440\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0432 any P?\u00bb \u2014 \u0414\u0430, A \u043b\u044f\u0436\u0435\u0442 inline, B \u043f\u043e\u0439\u0434\u0451\u0442 \u0432 heap.4. Type metadata: \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435Type metadata \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043b\u0435\u0436\u0430\u0449\u0430\u044f \u0432 read-only \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430. \u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e Swift-\u0442\u0438\u043f\u0430. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0434\u043b\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430:Kind \u2014 class \/ struct \/ enum \/ tuple \/ function \/ protocol \/ metatype.Size, alignment, stride \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 Value Witness Table (VWT).\u0418\u043c\u044f \u0442\u0438\u043f\u0430 (\u0434\u043b\u044f reflection \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438).\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 virtual table, isa-pointer \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 Objective-C.\u0414\u043b\u044f \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432 \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0438\u043f\u0430.\u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 Existential Container\u2019\u0430, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:\u0427\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 metadata \u0438\u0437 slot 3.\u0427\u0435\u0440\u0435\u0437 metadata \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 VWT.\u0427\u0435\u0440\u0435\u0437 VWT \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f (copy, destroy, move).\u042d\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.5. Value Witness TableVWT \u2014 \u044d\u0442\u043e, \u043f\u043e \u0441\u0443\u0442\u0438, \u00ab\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u00bb \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e:VWT:\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 ptr \u2192 destroy                              \u2502\u2502 ptr \u2192&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-482407","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=482407"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482407\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=482407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=482407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=482407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}