{"id":344626,"date":"2023-01-29T03:00:48","date_gmt":"2023-01-29T03:00:48","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=344626"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=344626","title":{"rendered":"<span>\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 \u0432 Swift<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div class=\"persona\" persona=\"true\"><img decoding=\"async\" persona=\"true\" class=\"image persona__image\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/722\/68c\/300\/72268c300da409dddf5a637ca5ca0be0.jpg\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/722\/68c\/300\/72268c300da409dddf5a637ca5ca0be0.jpg\" data-blurred=\"true\"\/><\/p>\n<h5 class=\"persona__heading\" persona=\"true\">\u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0422\u043e\u043a\u0430\u0440\u0435\u0432<\/h5>\n<p>iOS Developer \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e<\/p>\n<\/div>\n<p>\u041f\u043e\u0438\u0441\u043a \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043a\u043e\u0434\u0435 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f, \u0438 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0451\u043c, \u043d\u043e \u0438 \u043a\u043e\u043b\u043b\u0435\u0433, \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e. <\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc4\/443\/4ef\/bc44434ef48b1e9d4e7c65db4c873b71.png\" alt=\"\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 \u0432 Swift \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e\" title=\"\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 \u0432 Swift \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e\" width=\"1560\" height=\"885\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bc4\/443\/4ef\/bc44434ef48b1e9d4e7c65db4c873b71.png\"\/><figcaption>\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 \u0432 Swift \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e<\/figcaption><\/figure>\n<h2>\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0438\u043d\u0433 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/h2>\n<p>\u041f\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0448\u0440\u0438\u0444\u0442\u044b, \u0446\u0432\u0435\u0442\u0430, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 \u0438\u043a\u043e\u043d\u043a\u0438. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c SwiftGen.\u00a0<\/p>\n<p>SwiftGen \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u0437-\u0437\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u0430.\u00a0<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043f\u0438\u0441\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a: <\/p>\n<pre><code class=\"swift\">let image = UIImage(named: \"imageName\")<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043b\u044e\u0447\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p><strong>\u041e\u043f\u0435\u0447\u0430\u0442\u043a\u0430<\/strong>. \u0422\u0443\u0442, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0432\u0448\u0438\u0439\u0441\u044f font \u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0442\u043e \u043f\u043e\u0439\u043c\u0435\u0442\u0435, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c \u043a\u043b\u044e\u0447\u0435.<\/p>\n<p><strong>\u0417\u0430\u0431\u044b\u0432\u0447\u0438\u0432\u043e\u0441\u0442\u044c<\/strong>. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<p>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f SwiftGen, \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"swift\">let image = Assets.Icons.chechmark.image<\/code><\/pre>\n<p>\u041d\u0435\u0439\u043c\u0438\u043d\u0433, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0443\u0440\u043e\u0432\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430\u0436\u0430\u043b\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u201ccommand + B\u201d \u0438 \u0432\u0443\u0430\u043b\u044f \u2014 \u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u044b \u0443\u0445\u043e\u0434\u0438\u043c \u043e\u0442 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u044b\u0448\u0435 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0435\u0435.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 SwiftGen<\/h3>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c SwiftGen \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 CocoaPods. \u0422\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0451\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 podfile <strong>pod &#8216;SwiftGen&#8217;<\/strong>. \u0417\u0430\u0442\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043f\u0435\u0440\u0435\u0434 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u2014 <strong>&#171;$PODS_ROOT&#187;\/SwiftGen\/bin\/swiftgen<\/strong>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bca\/46a\/d70\/bca46ad70229b53860d04c9caa3f7aaf.png\" alt=\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e\" title=\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e\" width=\"2152\" height=\"856\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bca\/46a\/d70\/bca46ad70229b53860d04c9caa3f7aaf.png\"\/><figcaption>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e<\/figcaption><\/figure>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f SwiftGen<\/h3>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d. \u041f\u0430\u043a\u0435\u0442 SwiftGen \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0441\u0435\u0431\u044f.\u00a0<\/p>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 YAML-\u0444\u0430\u0439\u043b swiftgen.yml \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c, \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c. \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0441\u0432\u043e\u0451\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435:<\/p>\n<pre><code class=\"swift\">xcassets:   - inputs:      - Reservation\/Resources\/Colors.xcassets    outputs:      templatePath: colors-swiftui.stencil      params:        forceProvidesNamespaces: true        forceFileNameEnum: true        enumName: Colors      output: Reservation\/Resources\/Generated\/Colors+Generated.swift   - inputs:      - Reservation\/Resources\/Assets.xcassets    outputs:      templatePath: xcassets-swiftui.stencil      params:        forceProvidesNamespaces: true        forceFileNameEnum: true        enumName: Assets      output: Reservation\/Resources\/Generated\/XCAssets+Generated.swift  fonts:   inputs:     - Reservation\/Resources\/Fonts   outputs:     templatePath: fonts-swiftui.stencil     output: Reservation\/Resources\/Generated\/Fonts+Generated.swift  strings:   inputs:     - Reservation\/Resources\/Localizable   outputs:     templateName: structured-swift5     params:       enumName: Localization     output: Reservation\/Resources\/Generated\/Strings+Generated.swift<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0446\u0432\u0435\u0442\u043e\u0432:<\/p>\n<pre><code class=\"swift\">\/\/ swiftlint:disable identifier_name line_length nesting type_body_length type_name internal enum Colors {  internal static let error50 = ColorAsset(name: \"error50\")  internal static let error500 = ColorAsset(name: \"error500\")  internal static let neutral100 = ColorAsset(name: \"neutral100\")  internal static let neutral150 = ColorAsset(name: \"neutral150\")  internal static let neutral200 = ColorAsset(name: \"neutral200\")  internal static let neutral300 = ColorAsset(name: \"neutral300\")  internal static let neutral400 = ColorAsset(name: \"neutral400\")  internal static let neutral500 = ColorAsset(name: \"neutral500\")  internal static let onBackground500 = ColorAsset(name: \"onBackground500\")  internal static let onSurface500 = ColorAsset(name: \"onSurface500\")  internal static let primary400 = ColorAsset(name: \"primary400\")  internal static let primary50 = ColorAsset(name: \"primary50\")  internal static let primary500 = ColorAsset(name: \"primary500\")  internal static let secondary100 = ColorAsset(name: \"secondary100\")  internal static let secondary500 = ColorAsset(name: \"secondary500\")  internal static let secondaryVariant50 = ColorAsset(name: \"secondaryVariant50\")  internal static let secondaryVariant500 = ColorAsset(name: \"secondaryVariant500\") } \/\/ swiftlint:enable identifier_name line_length nesting type_body_length type_name  \/\/ MARK: - Implementation Details  internal struct ColorAsset {  fileprivate let name: String     internal var color: Color {   Color(self)  } }  internal extension Color {  \/\/\/ Creates a named color.  \/\/\/ - Parameter asset: the color resource to lookup.  init(_ asset: ColorAsset) {   let bundle = Bundle(for: BundleToken.self)   self.init(asset.name, bundle: bundle)  } }  private final class BundleToken {}<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f fonts:<\/p>\n<pre><code class=\"swift\">\/\/ swiftlint:disable all \/\/ Generated using SwiftGen \u2014 https:\/\/github.com\/SwiftGen\/SwiftGen  #if os(macOS)  import AppKit.NSFont #elseif os(iOS) || os(tvOS) || os(watchOS)  import UIKit.UIFont  import SwiftUI #endif  \/\/ swiftlint:disable superfluous_disable_command \/\/ swiftlint:disable file_length  \/\/ MARK: - Fonts  \/\/ swiftlint:disable identifier_name line_length type_body_length internal enum FontFamily {  internal enum Montserrat {   internal static let black = FontConvertible(name: \"Montserrat-Black\", family: \"Montserrat\", path: \"Montserrat-Black.ttf\")   internal static let blackItalic = FontConvertible(name: \"Montserrat-BlackItalic\", family: \"Montserrat\", path: \"Montserrat-BlackItalic.ttf\")   internal static let bold = FontConvertible(name: \"Montserrat-Bold\", family: \"Montserrat\", path: \"Montserrat-Bold.ttf\")   internal static let boldItalic = FontConvertible(name: \"Montserrat-BoldItalic\", family: \"Montserrat\", path: \"Montserrat-BoldItalic.ttf\")   internal static let extraBold = FontConvertible(name: \"Montserrat-ExtraBold\", family: \"Montserrat\", path: \"Montserrat-ExtraBold.ttf\")   internal static let extraBoldItalic = FontConvertible(name: \"Montserrat-ExtraBoldItalic\", family: \"Montserrat\", path: \"Montserrat-ExtraBoldItalic.ttf\")   internal static let extraLight = FontConvertible(name: \"Montserrat-ExtraLight\", family: \"Montserrat\", path: \"Montserrat-ExtraLight.ttf\")   internal static let extraLightItalic = FontConvertible(name: \"Montserrat-ExtraLightItalic\", family: \"Montserrat\", path: \"Montserrat-ExtraLightItalic.ttf\")   internal static let italic = FontConvertible(name: \"Montserrat-Italic\", family: \"Montserrat\", path: \"Montserrat-Italic.ttf\")   internal static let light = FontConvertible(name: \"Montserrat-Light\", family: \"Montserrat\", path: \"Montserrat-Light.ttf\")   internal static let lightItalic = FontConvertible(name: \"Montserrat-LightItalic\", family: \"Montserrat\", path: \"Montserrat-LightItalic.ttf\")   internal static let medium = FontConvertible(name: \"Montserrat-Medium\", family: \"Montserrat\", path: \"Montserrat-Medium.ttf\")   internal static let mediumItalic = FontConvertible(name: \"Montserrat-MediumItalic\", family: \"Montserrat\", path: \"Montserrat-MediumItalic.ttf\")   internal static let regular = FontConvertible(name: \"Montserrat-Regular\", family: \"Montserrat\", path: \"Montserrat-Regular.ttf\")   internal static let semiBold = FontConvertible(name: \"Montserrat-SemiBold\", family: \"Montserrat\", path: \"Montserrat-SemiBold.ttf\")   internal static let semiBoldItalic = FontConvertible(name: \"Montserrat-SemiBoldItalic\", family: \"Montserrat\", path: \"Montserrat-SemiBoldItalic.ttf\")   internal static let thin = FontConvertible(name: \"Montserrat-Thin\", family: \"Montserrat\", path: \"Montserrat-Thin.ttf\")   internal static let thinItalic = FontConvertible(name: \"Montserrat-ThinItalic\", family: \"Montserrat\", path: \"Montserrat-ThinItalic.ttf\")   internal static let all: [FontConvertible] = [black, blackItalic, bold, boldItalic, extraBold, extraBoldItalic, extraLight, extraLightItalic, italic, light, lightItalic, medium, mediumItalic, regular, semiBold, semiBoldItalic, thin, thinItalic]  }  internal enum OpenSans {   internal static let bold = FontConvertible(name: \"OpenSans-Bold\", family: \"Open Sans\", path: \"OpenSans-Bold.ttf\")   internal static let boldItalic = FontConvertible(name: \"OpenSans-BoldItalic\", family: \"Open Sans\", path: \"OpenSans-BoldItalic.ttf\")   internal static let extraBold = FontConvertible(name: \"OpenSans-ExtraBold\", family: \"Open Sans\", path: \"OpenSans-ExtraBold.ttf\")   internal static let extraBoldItalic = FontConvertible(name: \"OpenSans-ExtraBoldItalic\", family: \"Open Sans\", path: \"OpenSans-ExtraBoldItalic.ttf\")<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"swift\">internal enum Localization {  internal enum Authorization {   internal enum Authorization {    \/\/\/ \u0411\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0444\u0438\u0441\u043d\u044b\u0445 \u043c\u0435\u0441\u0442    internal static let bookingOfficePlaces = Localization.tr(\"Authorization\", \"Authorization.bookingOfficePlaces\")    \/\/\/ C\u0435\u0440\u0432\u0438\u0441 INOSTUDIO, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439    \/\/\/ \u0437\u0430\u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u043e\u0444\u0438\u0441\u0435.    internal static let bookingOfficePlacesDescription = Localization.tr(\"Authorization\", \"Authorization.bookingOfficePlacesDescription\")    \/\/\/ \u041d\u0435\u0432\u0435\u0440\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d \u043b\u043e\u0433\u0438\u043d \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c    internal static let credentialError = Localization.tr(\"Authorization\", \"Authorization.credentialError\")    \/\/\/ \u0414\u043e\u043c\u0435\u043d\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d    internal static let domainLogin = Localization.tr(\"Authorization\", \"Authorization.domainLogin\")    \/\/\/ \u0414\u043e\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c    internal static let domainPassword = Localization.tr(\"Authorization\", \"Authorization.domainPassword\")    \/\/\/ \u0412\u0430\u0448 \u043b\u043e\u0433\u0438\u043d    internal static let login = Localization.tr(\"Authorization\", \"Authorization.login\")    \/\/\/ \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c    internal static let next = Localization.tr(\"Authorization\", \"Authorization.next\")    \/\/\/ \u0412\u0430\u0448 \u043f\u0430\u0440\u043e\u043b\u044c    internal static let password = Localization.tr(\"Authorization\", \"Authorization.password\")   }  }  internal enum Common {   \/\/\/ \u041e\u0442\u043c\u0435\u043d\u0430   internal static let cancel = Localization.tr(\"Common\", \"cancel\")   \/\/\/ \u0441\u043c   internal static let cm = Localization.tr(\"Common\", \"cm\")   \/\/\/ \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430.   \/\/\/ \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437.   internal static let commonErrorMessage = Localization.tr(\"Common\", \"commonErrorMessage\")   \/\/\/ 404   internal static let commonErrorTitle = Localization.tr(\"Common\", \"commonErrorTitle\")   \/\/\/ \u0412\u044b\u0439\u0442\u0438   internal static let exit = Localization.tr(\"Common\", \"exit\")   \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443   \/\/\/ \u0438 VPN \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c   \/\/\/ \u043a \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443   internal static let networkErrorMessage = Localization.tr(\"Common\", \"networkErrorMessage\")   \/\/\/ \u0421\u0432\u044f\u0437\u044c \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430   internal static let networkErrorTitle = Localization.tr(\"Common\", \"networkErrorTitle\")   \/\/\/ \u041d\u0435\u0442   internal static let no = Localization.tr(\"Common\", \"no\")   \/\/\/ \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c   internal static let refresh = Localization.tr(\"Common\", \"refresh\")   \/\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c   internal static let save = Localization.tr(\"Common\", \"save\")   \/\/\/ \u0420\u0435\u0437\u0435\u0440\u0432   internal static let tab1 = Localization.tr(\"Common\", \"tab1\")   \/\/\/ \u041f\u043e\u0438\u0441\u043a   internal static let tab2 = Localization.tr(\"Common\", \"tab2\")   \/\/\/ \u041a\u0430\u0440\u0442\u0430 \u043c\u0435\u0441\u0442   internal static let tab3 = Localization.tr(\"Common\", \"tab3\")   \/\/\/ \u041f\u0440\u043e\u0444\u0438\u043b\u044c   internal static let tab4 = Localization.tr(\"Common\", \"tab4\")  }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"swift\">internal enum Assets {  internal enum Authorization {   internal static let logotype = ImageAsset(name: \"logotype\")  }  internal enum Icons {   internal static let arrow = ImageAsset(name: \"arrow\")   internal static let back = ImageAsset(name: \"back\")   internal static let checkmark = ImageAsset(name: \"checkmark\")   internal static let errorIcon = ImageAsset(name: \"errorIcon\")   internal static let eyeOff = ImageAsset(name: \"eyeOff\")   internal static let eyeOn = ImageAsset(name: \"eyeOn\")   internal static let filter = ImageAsset(name: \"filter\")   internal static let placeMap = ImageAsset(name: \"placeMap\")   internal static let placeMapActive = ImageAsset(name: \"placeMapActive\")   internal static let profile = ImageAsset(name: \"profile\")   internal static let profileActive = ImageAsset(name: \"profileActive\")   internal static let reserve = ImageAsset(name: \"reserve\")   internal static let reserveActive = ImageAsset(name: \"reserveActive\")   internal static let search = ImageAsset(name: \"search\")   internal static let searchActive = ImageAsset(name: \"searchActive\")   internal static let searchGray = ImageAsset(name: \"searchGray\")   internal static let trash = ImageAsset(name: \"trash\")   internal static let unwrapIndicator = ImageAsset(name: \"unwrapIndicator\")   internal static let unwrapIndicatorOpen = ImageAsset(name: \"unwrapIndicatorOpen\")  }  internal enum MyReservation {   internal static let myReservation = ImageAsset(name: \"myReservation\")  }  internal enum Profile {   internal static let blueCircle = ImageAsset(name: \"blueCircle\")   internal static let edit = ImageAsset(name: \"edit\")   internal static let exit = ImageAsset(name: \"exit\")  }  internal enum Search {   internal static let cancelCross = ImageAsset(name: \"cancelCross\")   internal static let searchHint = ImageAsset(name: \"searchHint\")  }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0439 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043f\u0430\u0440\u0430\u0445 \u00ab\u043a\u043b\u044e\u0447 \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.\u00a0<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0412\u0430\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 .gitignore, \u0447\u0442\u043e\u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439.<\/p>\n<h3>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433 \u2014 SwiftGen<\/h3>\n<p>SwiftGen \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e SwiftGen \u043d\u0430\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u0421 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<h2>\u0415\u0434\u0438\u043d\u044b\u0439 code style \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435  <\/h2>\n<p>SwiftLint \u2014 \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 Swift-\u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0442\u0438\u043b\u044e, \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u043c\u0443 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0432\u0437\u044f\u0442 <a href=\"https:\/\/github.com\/github\/swift-style-guide\" rel=\"noopener noreferrer nofollow\">Swift style guide<\/a> \u043e\u0442 Github.\u00a0<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435? \u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c, \u043f\u0440\u043e\u0449\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. \u0423\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c, \u044f\u0441\u043d\u044b\u043c, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442, \u043a\u0443\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u0445.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 SwiftLint<\/h3>\n<p>SwiftLint \u2014 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/ovchinnikov.cc\/writing\/homebrew\/\" rel=\"noopener noreferrer nofollow\"><u>Homebrew<\/u><\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <strong>brew install swiftlint<\/strong>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c SwiftLint.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/017\/5b4\/747\/0175b4747ce466d6dbf2745635ff4a45.png\" alt=\"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c SwiftLint \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e\" title=\"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c SwiftLint \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e\" width=\"2172\" height=\"1496\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/017\/5b4\/747\/0175b4747ce466d6dbf2745635ff4a45.png\"\/><figcaption>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c SwiftLint \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e<\/figcaption><\/figure>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 SwiftLint<\/h3>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e SwiftLint, \u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435. \u041c\u044b \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043e\u0442 raywenderlich.com. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u0432\u0443\u0445 \u0442\u0430\u0431\u043e\u0432 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435.<\/p>\n<pre><code>indentation_width:   indentation_width: 4<\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0434 \u0441\u0442\u0430\u0439\u043b\u0443, \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f\u0445 \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445. \u0422\u0430\u043a\u0436\u0435 \u043b\u044e\u0431\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/kodecocodes\/swift-style-guide\/blob\/main\/SWIFTLINT.markdown\" rel=\"noopener noreferrer nofollow\"><u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/u><\/a> \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\u00a0<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 SwiftLint \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u0434. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0440\u0430\u043d\u044c\u0448\u0435, \u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, SwiftLint \u0432\u044b\u043a\u0430\u0442\u0438\u0442 \u0432\u0430\u043c \u043a\u0443\u0447\u0443 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f16\/10d\/de7\/f1610dde718feca9fe1ca4f944df8c0f.png\" width=\"512\" height=\"34\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f16\/10d\/de7\/f1610dde718feca9fe1ca4f944df8c0f.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u0442\u0440\u043e\u0447\u043a\u0438, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5fe\/bcd\/36e\/5febcd36ee4583bab52f389cc0c1f4e9.png\" width=\"512\" height=\"38\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5fe\/bcd\/36e\/5febcd36ee4583bab52f389cc0c1f4e9.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u044d\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 SwiftLint. \u041d\u043e \u043c\u044b \u0441\u043e\u0432\u0435\u0442\u0443\u0435\u043c \u0432\u0430\u043c \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e. \u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u043f\u044b\u0442 \u0432 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u043c \u0441\u0442\u0438\u043b\u0435 \u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<h3>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433 \u2014 SwiftLint<\/h3>\n<p>SwiftLint \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043a\u043e\u0434-\u0440\u0435\u0432\u044c\u044e \u0438 \u043f\u0440\u043e\u0449\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0434\u0430\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432.<\/p>\n<h2>\u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0440\u0435\u0448\u0430\u0435\u043c \u043c\u0435\u0440\u0434\u0436-\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/h2>\n<p>\u0412\u0438\u0448\u0435\u043d\u043a\u043e\u0439 \u043d\u0430 \u0442\u043e\u0440\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f XcodeGen. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0445 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f IOS- \u0438 MacOs-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0440\u0434\u0436-\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0432 \u0444\u0430\u0439\u043b\u0435 .xcodeproj. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0442\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432) \u0432 \u0441\u043b\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0432\u0435\u0442\u043a\u0430\u0445.<\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u0444\u0430\u0439\u043b .xcodeproj \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0439 \u0411\u0414, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (NeXTSTEP). \u0420\u0443\u0447\u043d\u043e\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0441\u043e\u0438\u0437\u043c\u0435\u0440\u0438\u043c\u044b\u0445 \u0442\u0440\u0443\u0434\u043e\u0437\u0430\u0442\u0440\u0430\u0442.<\/p>\n<p>XcodeGen \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Swift. \u041e\u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Xcode \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 XcodeGen<\/h3>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 XcodeGen, \u043a\u0430\u043a \u0438 SwiftLint, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439, \u0434\u043b\u044f \u0435\u0451 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/ovchinnikov.cc\/writing\/homebrew\/\" rel=\"noopener noreferrer nofollow\"><u>Homebrew<\/u><\/a>. \u041f\u0438\u0448\u0435\u043c <strong>brew install xcodegen<\/strong>.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 XcodeGen<\/h3>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 .xcodeproj \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439.\u00a0<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 ..\/project.yaml.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438: \u0438\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u043f\u0430\u043a\u0435\u0442\u0430, \u0432\u0435\u0440\u0441\u0438\u044e Xcode, \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438: \u0441\u0445\u0435\u043c\u044b \u0441\u0431\u043e\u0440\u043a\u0438, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432, \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 CocoaPods).<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 .gitignore.<\/p>\n<pre><code class=\"swift\">## Build generated build\/ *.xcodeproj\/ DeriveData\/<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Reservation:<\/p>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>postGenCommand \u2014 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 CocoaPods \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 ID \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"swift\">name: Reservation  ## options section ##  options:  bundleIdPrefix: com.inostudio  xcodeVersion: '13.0.1'  deploymentTarget: '15.0'  groupSortPosition: top  generateEmptyDirectories: true  minimumXcodeGenVersion: '2.18.0'  defaultConfig: App Release  groupSortPosition: top  developmentLanguage: ru  postGenCommand: pod install  ## settings section ##  settings:  DEVELOPMENT_TEAM: 2375DJV45D  ## configs section ##  configs:  Dev Debug: debug  Stg Debug: debug  App Debug: debug  Dev Release: release  Stg Release: release  App Release: release<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0440\u0433\u0435\u0442\u0430 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 API \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u0445\u0435\u043c\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Dev, Stg, App):<\/p>\n<pre><code class=\"swift\">## targetTemplates section ##  targets:  Reservation:   type: application   platform: iOS   deploymentTarget: 15.0   scheme:    configVariants:      - Dev      - Stg      - App   settings:    base:     MARKETING_VERSION: 1.0     CURRENT_PROJECT_VERSION: 3     DEVELOPMENT_TEAM: 2375DJV45D     TARGETED_DEVICE_FAMILY: 1     GENERATE_INFOPLIST_FILE: YES     INFOPLIST_FILE: Reservation\/Resources\/Info.plist     INFOPLIST_KEY_UIApplicationSceneManifest_Generation: YES     INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents: YES     INFOPLIST_KEY_UILaunchScreen_Generation: YES     INFOPLIST_KEY_UILaunchStoryboardName: LaunchScreen     INFOPLIST_KEY_UISupportedInterfaceOrientations: UIInterfaceOrientationPortrait     INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone: UIInterfaceOrientationPortrait     INFOPLIST_KEY_UIUserInterfaceStyle: Light    configs:     Dev Debug:      PRODUCT_BUNDLE_IDENTIFIER: com.inostudio.ReservationDev      INFOPLIST_KEY_CFBundleDisplayName: ReservationDev     Dev Release:      PRODUCT_BUNDLE_IDENTIFIER: com.inostudio.ReservationDev      INFOPLIST_KEY_CFBundleDisplayName: ReservationDev     Stg Debug:      PRODUCT_BUNDLE_IDENTIFIER: com.inostudio.ReservationStage      INFOPLIST_KEY_CFBundleDisplayName: ReservationStg     Stg Release:      PRODUCT_BUNDLE_IDENTIFIER: com.inostudio.ReservationStage      INFOPLIST_KEY_CFBundleDisplayName: ReservationStg     App Debug:      PRODUCT_BUNDLE_IDENTIFIER: com.inostudio.Reservation      INFOPLIST_KEY_CFBundleDisplayName: Reservation     App Release:      PRODUCT_BUNDLE_IDENTIFIER: com.inostudio.Reservation      INFOPLIST_KEY_CFBundleDisplayName: Reservation   sources:     - path: Reservation<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043f\u043e\u0441\u0442\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 SwiftGen \u0438 SwiftLint):<\/p>\n<pre><code class=\"swift\">postCompileScripts:    - script: |         if [[ -f \"${PODS_ROOT}\/SwiftGen\/bin\/swiftgen\" ]]; then           \"${PODS_ROOT}\/SwiftGen\/bin\/swiftgen\"         else           echo \"warning: SwiftGen is not installed. Run 'pod install --repo-update' to install it.\"         fi     name: SwiftGen     basedOnDependencyAnalysis: false    - script: |         export PATH=\"$PATH:\/opt\/homebrew\/bin\"         PATH=\/opt\/homebrew\/bin:$PATH         if [ -f ~\/com.raywenderlich.swiftlint.yml ]; then          if which swiftlint >\/dev\/null; then          swiftlint --no-cache --config ~\/com.raywenderlich.swiftlint.yml          else           echo \"warning: SwiftLint not installed, download from https:\/\/github.com\/realm\/SwiftLint\"          fi         fi     name: SwiftLint     basedOnDependencyAnalysis: false<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 CocoaPods \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c xcodeGen generate.<\/p>\n<h2>\u0418\u0442\u043e\u0433\u0438<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0444\u0430\u0439\u043b Xcode-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <strong>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c<\/strong> \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0418 \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u044b\u043a\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0432 IDE. \u041d\u043e \u0446\u0435\u043d\u0430 \u0437\u0430 \u044d\u0442\u043e \u2014 \u0431\u0435\u0441\u0446\u0435\u043d\u043d\u043e\u0435 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043c\u0435\u0440\u0434\u0436-\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043e\u0441\u0432\u0435\u0442\u0438\u043b\u0438 \u043b\u0438\u0448\u044c \u043c\u0430\u043b\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 XcodeGen, \u0437\u0430 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0437\u043e\u0440\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <a href=\"https:\/\/github.com\/yonaskolb\/XcodeGen\" rel=\"noopener noreferrer nofollow\"><u>GitHub<\/u><\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \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\/post\/713456\/\"> https:\/\/habr.com\/ru\/post\/713456\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div class=\"persona\" persona=\"true\">\n<h5 class=\"persona__heading\" persona=\"true\">\u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0422\u043e\u043a\u0430\u0440\u0435\u0432<\/h5>\n<p>iOS Developer \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e<\/p>\n<\/div>\n<p>\u041f\u043e\u0438\u0441\u043a \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043a\u043e\u0434\u0435 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f, \u0438 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0451\u043c, \u043d\u043e \u0438 \u043a\u043e\u043b\u043b\u0435\u0433, \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e. <\/p>\n<figure class=\"bordered full-width\"><figcaption>\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 \u0432 Swift \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e<\/figcaption><\/figure>\n<h2>\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0438\u043d\u0433 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/h2>\n<p>\u041f\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0448\u0440\u0438\u0444\u0442\u044b, \u0446\u0432\u0435\u0442\u0430, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 \u0438\u043a\u043e\u043d\u043a\u0438. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c SwiftGen.\u00a0<\/p>\n<p>SwiftGen \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u0437-\u0437\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u0430.\u00a0<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043f\u0438\u0441\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a: <\/p>\n<pre><code class=\"swift\">let image = UIImage(named: \"imageName\")<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043b\u044e\u0447\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p><strong>\u041e\u043f\u0435\u0447\u0430\u0442\u043a\u0430<\/strong>. \u0422\u0443\u0442, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0432\u0448\u0438\u0439\u0441\u044f font \u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0442\u043e \u043f\u043e\u0439\u043c\u0435\u0442\u0435, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c \u043a\u043b\u044e\u0447\u0435.<\/p>\n<p><strong>\u0417\u0430\u0431\u044b\u0432\u0447\u0438\u0432\u043e\u0441\u0442\u044c<\/strong>. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<p>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f SwiftGen, \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"swift\">let image = Assets.Icons.chechmark.image<\/code><\/pre>\n<p>\u041d\u0435\u0439\u043c\u0438\u043d\u0433, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0443\u0440\u043e\u0432\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430\u0436\u0430\u043b\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u201ccommand + B\u201d \u0438 \u0432\u0443\u0430\u043b\u044f \u2014 \u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u044b \u0443\u0445\u043e\u0434\u0438\u043c \u043e\u0442 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u044b\u0448\u0435 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0435\u0435.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 SwiftGen<\/h3>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c SwiftGen \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 CocoaPods. \u0422\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0451\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 podfile <strong>pod &#8216;SwiftGen&#8217;<\/strong>. \u0417\u0430\u0442\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043f\u0435\u0440\u0435\u0434 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u2014 <strong>&#171;$PODS_ROOT&#187;\/SwiftGen\/bin\/swiftgen<\/strong>.<\/p>\n<figure class=\"full-width\"><figcaption>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Build Phase, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u2014 \u0418\u043d\u043e\u0441\u0442\u0443\u0434\u0438\u043e<\/figcaption><\/figure>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f SwiftGen<\/h3>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d. \u041f\u0430\u043a\u0435\u0442 SwiftGen \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0441\u0435\u0431\u044f.\u00a0<\/p>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 YAML-\u0444\u0430\u0439\u043b swiftgen.yml \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c, \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c. \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0441\u0432\u043e\u0451\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435:<\/p>\n<pre><code class=\"swift\">xcassets:   - inputs:      - Reservation\/Resources\/Colors.xcassets    outputs:      templatePath: colors-swiftui.stencil      params:        forceProvidesNamespaces: true        forceFileNameEnum: true        enumName: Colors      output: Reservation\/Resources\/Generated\/Colors+Generated.swift   - inputs:      - Reservation\/Resources\/Assets.xcassets    outputs:      templatePath: xcassets-swiftui.stencil      params:        forceProvidesNamespaces: true        forceFileNameEnum: true        enumName: Assets      output: Reservation\/Resources\/Generated\/XCAssets+Generated.swift  fonts:   inputs:     - Reservation\/Resources\/Fonts   outputs:     templatePath: fonts-swiftui.stencil     output: Reservation\/Resources\/Generated\/Fonts+Generated.swift  strings:   inputs:     - Reservation\/Resources\/Localizable   outputs:     templateName: structured-swift5     params:       enumName: Localization     output: Reservation\/Resources\/Generated\/Strings+Generated.swift<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0446\u0432\u0435\u0442\u043e\u0432:<\/p>\n<pre><code class=\"swift\">\/\/ swiftlint:disable identifier_name line_length nesting type_body_length type_name internal enum Colors {  internal static let error50 = ColorAsset(name: \"error50\")  internal static let error500 = ColorAsset(name: \"error500\")  internal static let neutral100 = ColorAsset(name: \"neutral100\")  internal static let neutral150 = ColorAsset(name: \"neutral150\")  internal static let neutral200 = ColorAsset(name: \"neutral200\")  internal static let neutral300 = ColorAsset(name: \"neutral300\")  internal static let neutral400 = ColorAsset(name: \"neutral400\")  internal static let neutral500 = ColorAsset(name: \"neutral500\")  internal static let onBackground500 = ColorAsset(name: \"onBackground500\")  internal static let onSurface500 = ColorAsset(name: \"onSurface500\")  internal static let primary400 = ColorAsset(name: \"primary400\")  internal static let primary50 = ColorAsset(name: \"primary50\")  internal static let primary500 = ColorAsset(name: \"primary500\")  internal static let secondary100 = ColorAsset(name: \"secondary100\")  internal static let secondary500 = ColorAsset(name: \"secondary500\")  internal static let secondaryVariant50 = ColorAsset(name: \"secondaryVariant50\")  internal static let secondaryVariant500 = ColorAsset(name: \"secondaryVariant500\") } \/\/ swiftlint:enable identifier_name line_length nesting type_body_length type_name  \/\/ MARK: - Implementation Details  internal struct ColorAsset {  fileprivate let name: String     internal var color: Color {   Color(self)  } }  internal extension Color {  \/\/\/ Creates a named color.  \/\/\/ - Parameter asset: the color resource to lookup.  init(_ asset: ColorAsset) {   let bundle = Bundle(for: BundleToken.self)   self.init(asset.name, bundle: bundle)  } }  private final class BundleToken {}<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f fonts:<\/p>\n<pre><code class=\"swift\">\/\/ swiftlint:disable all \/\/ Generated using SwiftGen \u2014 https:\/\/github.com\/SwiftGen\/SwiftGen  #if os(macOS)  import AppKit.NSFont #elseif os(iOS) || os(tvOS) || os(watchOS)  import UIKit.UIFont  import SwiftUI #endif  \/\/ swiftlint:disable superfluous_disable_command \/\/ swiftlint:disable file_length  \/\/ MARK: - Fonts  \/\/ swiftlint:disable identifier_name line_length type_body_length internal enum FontFamily {  internal enum Montserrat {   internal static let black = FontConvertible(name: \"Montserrat-Black\", family: \"Montserrat\", path: \"Montserrat-Black.ttf\")   internal static let blackItalic = FontConvertible(name: \"Montserrat-BlackItalic\", family: \"Montserrat\", path: \"Montserrat-BlackItalic.ttf\")   internal static let bold = FontConvertible(name: \"Montserrat-Bold\", family: \"Montserrat\", path: \"Montserrat-Bold.ttf\")   internal static let boldItalic = FontConvertible(name: \"Montserrat-BoldItalic\", family: \"Montserrat\", path: \"Montserrat-BoldItalic.ttf\")   internal static let extraBold = FontConvertible(name: \"Montserrat-ExtraBold\", family: \"Montserrat\", path: \"Montserrat-ExtraBold.ttf\")   internal static let extraBoldItalic = FontConvertible(name: \"Montserrat-ExtraBoldItalic\", family: \"Montserrat\", path: \"Montserrat-ExtraBoldItalic.ttf\")   internal static let extraLight = FontConvertible(name: \"Montserrat-ExtraLight\", family: \"Montserrat\", path: \"Montserrat-ExtraLight.ttf\")   internal static let extraLightItalic = FontConvertible(name: \"Montserrat-ExtraLightItalic\", family: \"Montserrat\", path: \"Montserrat-ExtraLightItalic.ttf\")   internal static let italic = FontConvertible(name: \"Montserrat-Italic\", family: \"Montserrat\", path: \"Montserrat-Italic.ttf\")   internal static let light = FontConvertible(name: \"Montserrat-Light\", family: \"Montserrat\", path: \"Montserrat-Light.ttf\")   internal static let lightItalic = FontConvertible(name: \"Montserrat-LightItalic\", family: \"Montserrat\", path: \"Montserrat-LightItalic.ttf\")   internal static let medium = FontConvertible(name: \"Montserrat-Medium\", family: \"Montserrat\", path: \"Montserrat-Medium.ttf\")   internal static let mediumItalic = FontConvertible(name: \"Montserrat-MediumItalic\", family: \"Montserrat\", path: \"Montserrat-MediumItalic.ttf\")   internal static let regular = FontConvertible(name: \"Montserrat-Regular\", family: \"Montserrat\", path: \"Montserrat-Regular.ttf\")   internal static let semiBold = FontConvertible(name: \"Montserrat-SemiBold\", family: \"Montserrat\", path: \"Montserrat-SemiBold.ttf\")   internal static let semiBoldItalic = FontConvertible(name: \"Montserrat-SemiBoldItalic\", family: \"Montserrat\", path: \"Montserrat-SemiBoldItalic.ttf\")   internal static let thin = FontConvertible(name: \"Montserrat-Thin\", family: \"Montserrat\", path: \"Montserrat-Thin.ttf\")   internal static let thinItalic = FontConvertible(name: \"Montserrat-ThinItalic\", family: \"Montserrat\", path: \"Montserrat-ThinItalic.ttf\")   internal static let all: [FontConvertible] = [black, blackItalic, bold, boldItalic, extraBold, extraBoldItalic, extraLight, extraLightItalic, italic, light, lightItalic, medium, mediumItalic, regular, semiBold, semiBoldItalic, thin, thinItalic]  }  internal enum OpenSans {   internal static let bold = FontConvertible(name: \"OpenSans-Bold\", family: \"Open Sans\", path: \"OpenSans-Bold.ttf\")   internal static let boldItalic = FontConvertible(name: \"OpenSans-BoldItalic\", family: \"Open Sans\", path: \"OpenSans-BoldItalic.ttf\")   internal static let extraBold = FontConvertible(name: \"OpenSans-ExtraBold\", family: \"Open Sans\", path: \"OpenSans-ExtraBold.ttf\")   internal static let extraBoldItalic = FontConvertible(name: \"OpenSans-ExtraBoldItalic\", family: \"Open Sans\", path: \"OpenSans-ExtraBoldItalic.ttf\")<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"swift\">internal enum Localization {  internal enum Authorization {   internal enum Authorization {    \/\/\/ \u0411\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0444\u0438\u0441\u043d\u044b\u0445 \u043c\u0435\u0441\u0442    internal static let bookingOfficePlaces = Localization.tr(\"Authorization\", \"Authorization.bookingOfficePlaces\")    \/\/\/ C\u0435\u0440\u0432\u0438\u0441 INOSTUDIO, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439    \/\/\/ \u0437\u0430\u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u043e\u0444\u0438\u0441\u0435.    internal static let bookingOfficePlacesDescription = Localization.tr(\"Authorization\", \"Authorization.bookingOfficePlacesDescription\")    \/\/\/ \u041d\u0435\u0432\u0435\u0440\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d \u043b\u043e\u0433\u0438\u043d \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c    internal static let credentialError = Localization.tr(\"Authorization\", \"Authorization.credentialError\")<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-344626","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/344626","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=344626"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/344626\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=344626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=344626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=344626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}