{"id":381847,"date":"2024-06-29T03:54:56","date_gmt":"2024-06-29T03:54:56","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=381847"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=381847","title":{"rendered":"<span>WWDC 2023. \u041d\u043e\u0432\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a SwiftData \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b<\/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<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a3\/aaa\/96f\/7a3aaa96f9971a6cc59432ee30c3bd5f.png\" width=\"1360\" height=\"774\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a3\/aaa\/96f\/7a3aaa96f9971a6cc59432ee30c3bd5f.png\"\/><\/figure>\n<p>SwiftData \u0434\u0435\u0431\u044e\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0430 <a href=\"https:\/\/developer.apple.com\/wwdc23\/10187\" rel=\"noopener noreferrer nofollow\">WWDC 2023 <\/a>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Core Data. \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 Apple \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445,  \u0431\u0435\u0441\u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c iCloud, \u0412\u0435\u0441\u044c API SwiftData \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e Swift. SwiftData \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e <code>iOS 17<\/code> \u0438 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044f Xcode<code> 15.0<\/code><\/p>\n<p>\u0412 SwiftData, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u0430, \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 Core Data, \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0421\u0445\u0435\u043c\u0443 (\u0438\u043b\u0438 \u041c\u043e\u0434\u0435\u043b\u044c \u0414\u0430\u043d\u043d\u044b\u0445) \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e  <strong>\u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435<\/strong> \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0435 Swift  \u043a\u043b\u0430\u0441\u0441\u044b <code>class<\/code> \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 Swift \u0422\u0418\u041f\u044b , <code>Codable<\/code> \u0422\u0418\u041f\u044b  \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 Swift  \u043a\u043b\u0430\u0441\u0441\u044b  \u0421\u0445\u0435\u043c\u044b.  \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a <code>Optional<\/code> \u0422\u0418\u041f\u044b, \u0442\u0430\u043a \u0438 \u041d\u0415-<code>Optional<\/code>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 Swift \u043a\u043b\u0430\u0441\u0441\u044b \u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, <em>Apple<\/em> \u0434\u0430\u043b\u0430 \u043d\u0430\u043c &#171;\u0432\u043e\u043b\u0448\u0435\u0431\u043d\u0443\u044e \u043f\u0430\u043b\u043e\u0447\u043a\u0443&#187; \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432,  \u0441\u0430\u043c\u044b\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <code>@Model<\/code>.   <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c <code>@Model<\/code>\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u00a0Swift \u043a\u043b\u0430\u0441\u0441\u044b, \u0442\u043e  \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e  \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043d\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0438\u0445 <code>Observable, Hashable<\/code> \u0438<code> Identifiable<\/code>, \u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u0445 \u0432 SwiftUI, \u0438\u0431\u043e \u043d\u043e\u0432\u044b\u0439 \u0432 iOS 17 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<code>Observable<\/code>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0432\u0430\u043c &#171;\u0436\u0438\u0432\u043e\u0435&#187; \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 UI \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u0430\u0448\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430 <code>Identifiable <\/code>\u0438<code> Hashable<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0431\u0435\u0441\u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043a\u0430\u0445<code>ForEach.<\/code><\/p>\n<p>\u0412 SwiftData, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Core Data, \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u041c\u043e\u0434\u0435\u043b\u0438 \u0414\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 &#171;\u0437\u0430\u043a\u0443\u043b\u0438\u0441\u043d\u043e\u0439&#187; \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 Objective-C \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/667874\/\" rel=\"noopener noreferrer nofollow\">\u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Swift<\/a>. \u0412 SwiftData<code> - \u0432\u0441\u0451<\/code>\u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 SwiftData \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Core Data, \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0435\u0451 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0430 UI. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 &#171;\u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430&#187; <code>@Query<\/code> , \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 <code>Predicate<\/code> (\u0442\u043e \u0435\u0441\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445) \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 <code>SoreDescriptor<\/code>. \u041d\u043e\u0432\u044b\u0439 \u043c\u043e\u0449\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 <code>Predicate<\/code> \u0432\u044b\u0433\u043e\u0434\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 <code>NSPredicate<\/code> Core Data \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Swift, \u0430 \u043d\u0435 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e <a href=\"https:\/\/nspredicate.xyz\/coredata.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u0443\u044e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 <\/a>. <\/p>\n<p>SwiftData \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d \u0442\u0430\u043a\u0438\u043c\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043a\u0430\u043a Swift \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 Swift 5.9 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0441\u0430\u043c\u043e\u0433\u043e <em>Apple<\/em>,  \u201c\u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e\u0435\u201d  \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. SwiftData \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 SwiftUI \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 CloudKit \u0438 Widgets.\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0447\u043d\u0435\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e SwiftData, \u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u0434\u0430\u0436\u0435 &#171;\u0434\u0443\u0445\u0430&#187; Core Data, \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c Swifty.  <em>Apple<\/em> \u043d\u0430\u0441\u0442\u0430\u0438\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e SwiftData &#8212; \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0442 Core Data \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043d\u0430\u043c \u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 SwiftData &#171;\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u043e\u0439&#187; Core Data, \u043d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a, \u0442\u043e \u043e\u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e, \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e  \u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430,  \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 &#171;\u0440\u043e\u0434\u043d\u043e\u0439&#187; c\u0440\u0435\u0434\u0435 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Swift.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0432\u0430\u043c, \u043a\u0430\u043a <\/p>\n<ul>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0421\u0445\u0435\u043c\u0443  \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData, <\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c CRUD \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (Create &#8212;  \u0421\u043e\u0437\u0434\u0430\u0442\u044c, Read &#8212; \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, Update &#8212; \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c, Delete &#8212; \u0443\u0434\u0430\u043b\u0438\u0442\u044c), <\/p>\n<\/li>\n<li>\n<p>\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b <code>Query<\/code> \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 <code>Predicate<\/code>, <\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c &#171;\u0436\u0438\u0432\u043e\u0439&#187; \u0437\u0430\u043f\u0440\u043e\u0441 <code>@Query<\/code>\u0432 SwiftUI \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c,<\/p>\n<\/li>\n<li>\n<p>\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e &#171;\u0437\u0430\u043a\u0430\u0447\u0430\u0442\u044c&#187; JSON  \u0434\u0430\u043d\u043d\u044b\u0435  \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0431\u0435\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (UI).<\/p>\n<\/li>\n<\/ul>\n<h2>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0421\u0445\u0435\u043c\u044b \u0414\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData<\/h2>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/cs193p.sites.stanford.edu\/2020\" rel=\"noopener noreferrer nofollow\">Enroute \u0438\u0437 \u0441\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u0438\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 CS193P 2020<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0441\u0435 \u0440\u0435\u0439\u0441\u044b <code>Flight<\/code>, \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u0432\u0443\u043c\u044f \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430\u043c\u0438:  \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u043c \u0427\u0438\u043a\u0430\u0433\u043e &#171;Chicago O&#8217;Hare Intl&#187; \u0438 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u043c \u0421\u0430\u043d-\u0424\u0440\u0430\u043d\u0446\u0438\u0441\u043a\u043e &#171;San Francisco Int&#8217;l&#187;. \u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u044d\u0442\u0438\u0445 \u0440\u0435\u0439\u0441\u0430\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043c\u043d\u043e\u044e \u0441 \u0441\u0430\u0439\u0442\u0430\u00a0<a href=\"https:\/\/ru.flightaware.com\/\" rel=\"noopener noreferrer nofollow\">FlightAware<\/a> \u0432 JSON \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041c\u044b &#171;\u0437\u0430\u043a\u0430\u0447\u0430\u0435\u043c&#187; \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438 \u0441\u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0440\u0435\u0439\u0441\u0430\u0445, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430\u0445 \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 &#8230; <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/00f\/744\/238\/00f7442387992fec53b4ded985a56ec4.png\" alt=\"\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0440\u0435\u0439\u0441\u043e\u0432, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439\" title=\"\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0440\u0435\u0439\u0441\u043e\u0432, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439\" width=\"2110\" height=\"1388\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/00f\/744\/238\/00f7442387992fec53b4ded985a56ec4.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0440\u0435\u0439\u0441\u043e\u0432, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p>&#8230; \u043d\u043e \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432. <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0439\u0441\u044b <code>Flights<\/code> \u043f\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f &#8212; <code>destination<\/code>, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0443 \u0432\u044b\u043b\u0435\u0442\u0430 &#8212; <code>origin<\/code>,  \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 &#8212; <code>airline<\/code> \u0438  \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435 &#8212; <code>Enroute Only<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4bc\/ec3\/231\/4bcec32314a1863cc79d781b992b0dfb.png\" alt=\"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0439\u0441\u043e\u0432\" title=\"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0439\u0441\u043e\u0432\" width=\"1434\" height=\"1416\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4bc\/ec3\/231\/4bcec32314a1863cc79d781b992b0dfb.png\"\/><\/p>\n<div><figcaption>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0439\u0441\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Picker<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>destination<\/code> \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0439 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u0432 \u0427\u0438\u043a\u0430\u0433\u043e &#8212; &#171;Chicago O&#8217;Hare Intl&#187;,  \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0439\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435 <code>Enroute Only<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a3e\/3d1\/dfa\/a3e3d1dfa9d327b96801f2508916b9e2.png\" alt=\"\u0412\u044b\u0431\u043e\u0440 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Picker\" title=\"\u0412\u044b\u0431\u043e\u0440 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Picker\" width=\"1406\" height=\"1390\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a3e\/3d1\/dfa\/a3e3d1dfa9d327b96801f2508916b9e2.png\"\/><\/p>\n<div><figcaption>\u0412\u044b\u0431\u043e\u0440 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Picker<\/figcaption><\/div>\n<\/figure>\n<p>&#8230; \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0439\u0441\u043e\u0432, \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435  &#171;Done&#187;:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/498\/6a4\/678\/4986a4678b096c43d087dffaf63a0a4b.png\" alt=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0431\u043e\u0440\u043a\u0438\" title=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0431\u043e\u0440\u043a\u0438\" width=\"1312\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/498\/6a4\/678\/4986a4678b096c43d087dffaf63a0a4b.png\"\/><\/p>\n<div><figcaption>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0431\u043e\u0440\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u044b \u043f\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u0431\u0443\u043a\u0432\u0430\u043c \u0438\u043c\u0435\u043d\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &#171;San &#187; \u0438, \u0432\u044b\u0431\u0440\u0430\u0432 \u0438\u0437 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &#171;San Francisco Int&#8217;l&#187; (\u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0439 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u0421\u0430\u043d-\u0424\u0440\u0430\u043d\u0446\u0438\u0441\u043a\u043e), \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0451\u043c: \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0440\u0435\u0439\u0441\u044b, \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0435  \u0438 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0435 \u0432 \u044d\u0442\u043e\u0442 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a08\/6fa\/87a\/a086fa87a859d52b93d7d0b62696dbf0.png\" alt=\"\u041f\u043e\u0438\u0441\u043a \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438\" title=\"\u041f\u043e\u0438\u0441\u043a \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438\" width=\"1432\" height=\"1414\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a08\/6fa\/87a\/a086fa87a859d52b93d7d0b62696dbf0.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0438\u0441\u043a \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0439\u0441\u044b \u043d\u0443\u0436\u043d\u044b\u043c \u043d\u0430\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0435\u0442\u0430 <code>distance<\/code> \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f: <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b9b\/419\/f0e\/b9b419f0ee4a2ca87f15f8f6037dbd40.png\" alt=\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0420\u0435\u0439\u0441\u043e\u0432 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0435\u0442\u0430 \u0432 \u0443\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\" title=\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0420\u0435\u0439\u0441\u043e\u0432 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0435\u0442\u0430 \u0432 \u0443\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\" width=\"1448\" height=\"1418\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b9b\/419\/f0e\/b9b419f0ee4a2ca87f15f8f6037dbd40.png\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0420\u0435\u0439\u0441\u043e\u0432 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0435\u0442\u0430 \u0432 \u0443\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0442\u043e\u0447\u043d\u043e <a href=\"https:\/\/&quot;San%20Francisco%20Int'l&quot;\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Enroute, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c Core Data<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c <u>SwiftData Airport<\/u> \u00a0\u0432<a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\">\u00a0Github<\/a>.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043d\u0430\u0448\u0435\u0439 \u0421\u0445\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0439\u0441\u00a0<code>Flight<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 <code>airline:<\/code> <code>Airline<\/code> \u043c\u0435\u0436\u0434\u0443 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u043c  \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f  <code>origin: Airport<\/code> \u0438 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u043c  \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>destination: Airport<\/code>. \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438<code>Swift<\/code> \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438: <code>Flight<\/code>,<code>Airport<\/code> \u0438 <code>Airline<\/code> :<\/p>\n<pre><code class=\"swift\">class Flight {     var ident: String          var actualOff: Date?     var scheduledOff: Date     var estimatedOff: Date     var scheduledOn: Date     var estimatedOn: Date     var actualOn: Date?          var progressPercent: Int     var status: String     var routeDistance: Int     var filedAirspeed:Int     var filedAltitude: Int          var origin: Airport     var destination: Airport     var airline: Airline      var aircraftType: String }<\/code><\/pre>\n<p>\u0423 \u0440\u0435\u0439\u0441\u0430 <code>Flight<\/code> \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u0435\u0439\u0441\u0430 <code>ident<\/code>, \u0432\u0440\u0435\u043c\u044f \u0432\u0437\u043b\u0435\u0442\u0430 (\u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e <code>scheduledOff<\/code>, \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435  <code>estimatedOff<\/code> \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <code>actualOff<\/code>), \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u044f (\u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e <code>scheduledOn<\/code>, \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435  <code>estimatedOn<\/code> \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <code>actualOn<\/code>), \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>origin: Airport<\/code>, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u044f<code>destination: Airport<\/code>, \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f <code>airline: Airline<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f \u044d\u0442\u043e\u0442 \u0440\u0435\u0439\u0441, \u0442\u0438\u043f \u0441\u0430\u043c\u043e\u043b\u0435\u0442\u0430 <code>aircraftTyp\u0435<\/code>. \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>routeDistance<\/code> \u043c\u0435\u0436\u0434\u0443 \u043f\u0443\u043d\u043a\u0442\u0430\u043c\u0438 \u043e\u0442\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c <code>filedAirspeed<\/code>, \u0432\u044b\u0441\u043e\u0442\u0430 <code>filedAltitude<\/code>  \u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 <code>progressPercent<\/code>.<\/p>\n<pre><code class=\"swift\">class Airport {     var icao: String     var name: String     var city: String     var countryCode: String     var latitude: Double     var longitude: Double     var timezone: String       var flightsTo: [Flight] = []     var flightsFrom: [Flight] = [] }<\/code><\/pre>\n<p>\u0410\u044d\u0440\u043e\u043f\u043e\u0440\u0442 <code>Airport<\/code>\u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u0434 <code>icao<\/code>, \u0438\u043c\u044f <code>name<\/code>, \u0433\u043e\u0440\u043e\u0434 <code>city<\/code>, \u0448\u0442\u0430\u0442 <code>state<\/code>, \u043a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u044b <code>countryCode<\/code> , \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <code>latitude<\/code> \u0438 <code>longitude<\/code> \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f , \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u044f\u0441  <code>timezone<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0440\u0435\u0439\u0441\u0430\u0445, \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0445 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 <code>flightsFrom<\/code>, \u0438 \u043e \u0440\u0435\u0439\u0441\u0430\u0445, \u043f\u0440\u0438\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0432 \u044d\u0442\u043e\u0442 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442, <code>flightsTo<\/code>.<\/p>\n<pre><code class=\"swift\">class Airline {     var code: String     var name: String     var shortName: String       var flights: [Flight] = [] }<\/code><\/pre>\n<p>\u0410\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f <code>Airline<\/code>\u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u0434 <code>code<\/code>, \u0438\u043c\u044f <code>name<\/code>, \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0438\u043c\u044f  <code>shortName<\/code>. \u041d\u0430\u0441 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0441\u0435\u0445 \u0440\u0435\u0439\u0441\u0430\u0445 <code>flights<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0439 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439. <\/p>\n<p>\u0412 SwiftData \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434 Swift \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 <code>@Model<\/code>, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c &#171;\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u0443\u044e&#187; \u041c\u043e\u0434\u0435\u043b\u044c \u0414\u0430\u043d\u043d\u044b\u0445,  \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f &#171;\u0440\u0435\u0439\u0441\u044b&#187; <code>Flight<\/code>,   &#171;\u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438&#187; <code>Airline<\/code> \u0438 &#171;\u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u044b&#187;<code>Airport<\/code>, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044f\u043c\u0438:\u00a0<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  @Model final class Flight {     var ident: String          var actualOff: Date?     var scheduledOff: Date     var estimatedOff: Date     var scheduledOn: Date     var estimatedOn: Date     var actualOn: Date?          var progressPercent: Int     var status: String     var routeDistance: Int     var filedAirspeed:Int     var filedAltitude: Int          var origin: Airport     var destination: Airport     var airline: Airline      var aircraftType: String }<\/code><\/pre>\n<pre><code class=\"swift\">@Model final class Airport {     var icao: String     var name: String     var city: String     var state: String     var countryCode: String     var latitude: Double     var longitude: Double     var timezone: String          var flightsFrom: [Flight] = []     var flightsTo: [Flight] = [] }   @Model class Airline {     var code: String     var name: String     var shortName: String       var flights: [Flight] = [] }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0443<code>@Model<\/code> SwiftData \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0441\u0435 <strong>\u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435<\/strong> \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 Swift \u043a\u043b\u0430\u0441\u0441\u0430  \u0432 <strong>\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e<\/strong> \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.  <\/p>\n<p> \u0415\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u0435\u0442 <strong>Value <\/strong>\u0422\u0418\u041f, SwiftData \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a <u>\u0430\u0442\u0440\u0438\u0431\u0443\u0442<\/u>. \u0422\u0430\u043a\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0433\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f:<\/p>\n<ul>\n<li>\n<p>\u0431\u0430\u0437\u043e\u0432\u044b\u0435 <strong>Value<\/strong> \u0422\u0418\u041f\u044b (<code>String<\/code>, <code>Int<\/code> \u0438 <code>Float<\/code> \u0438 \u0442.\u0434.)<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 <strong>Value<\/strong> \u0422\u0418\u041f\u044b :<\/p>\n<ul>\n<li>\n<p>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>struct<\/code><\/p>\n<\/li>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>enum<\/code><\/p>\n<\/li>\n<li>\n<p><code>Codable<\/code> \u0422\u0418\u041f\u044b<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 <strong>Value<\/strong> \u0422\u0418\u041f\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><code>\u0415\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e<\/code> \u0438\u043c\u0435\u0435\u0442 \u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0439 <strong>Reference<\/strong> \u0422\u0418\u041f (\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>class<\/code>), \u0442\u043e SwiftData \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442  \u0435\u0433\u043e \u043a\u0430\u043a <u>\u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044c<\/u>. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438:<\/p>\n<ul>\n<li>\n<p>\u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 <code>@Model<\/code>\u0422\u0418\u041f\u0430\u043c\u0438  <\/p>\n<\/li>\n<li>\n<p>\u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438<code>@Model<\/code>\u0422\u0418\u041f\u043e\u0432 <\/p>\n<\/li>\n<\/ul>\n<h2>\u041c\u0430\u043a\u0440\u043e\u0441\u044b @Attribute, @Relationship \u0438 @Transient<\/h2>\n<p> <code>@Model<\/code>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435  \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0430\u0448\u0435\u0433\u043e Swift \u043a\u043b\u0430\u0441\u0441\u0430 \u043b\u0438\u0431\u043e \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u043b\u0438\u0431\u043e \u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438,  \u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c. \u041d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a SwiftData \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f  &#171;\u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0435 \u043f\u0430\u043b\u043e\u0447\u043a\u0438&#187; (\u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b) \u0438  \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430  <code>@Model<\/code> \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>@Attribute<\/code><\/p>\n<\/li>\n<li>\n<p><code>@Relationship<\/code><\/p>\n<\/li>\n<li>\n<p><code>@Transient<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e  \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Attribute<\/code> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,  \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0440\u0435\u0439\u0441\u0430 <code>ident<\/code>: <\/p>\n<pre><code class=\"swift\">@Model final class Flight {    @Attribute (.unique) var ident: String          var actualOff: Date?     var scheduledOff: Date     var estimatedOff: Date          var scheduledOn: Date     var estimatedOn: Date     var actualOn: Date?          var progressPercent: Int     var status: String     var routeDistance: Int     var filedAirspeed:Int     var filedAltitude: Int          var origin: Airport     var destination: Airport     var airline: Airline      var aircraftType: String }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0435\u0441\u044c \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0439\u0441 <code>Flight<\/code> \u0441 \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 ident, \u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0439\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u0430\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e  \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Relationship<\/code>\u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044f\u043c\u0438 c <code>@Model<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0438 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438 \u0442\u0438\u043f\u0430 &#171;\u043e\u0434\u0438\u043d-\u043a\u043e-\u043c\u043d\u043e\u0433\u0438\u043c&#187;  \u0438\u043b\u0438 &#171;\u043c\u043d\u043e\u0433\u0438\u0435-\u043a\u043e-\u043c\u043d\u043e\u0433\u0438\u043c&#187;.  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>\u0434\u043b\u044f \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 Airport<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Relationship<\/code>  \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c &#171;\u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0432\u043d\u044b\u0435&#187; \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438 \u0434\u043b\u044f <code>flightsFrom <\/code>\u0438\u00a0<code>flightsTo <\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432  \u0440\u0435\u0439\u0441\u0435 <code>Flight<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>origin<\/code> \u0438 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>destination<\/code>:<\/p>\n<pre><code class=\"swift\">@Model final class Airport {     var icao: String     var name: String     var city: String     var state: String     var countryCode: String     var latitude: Double     var longitude: Double     var timezone: String          @Relationship (inverse: \\Flight.origin) var flightsFrom: [Flight]     @Relationship (inverse: \\Flight.destination) var flightsTo: [Flight] }<\/code><\/pre>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 <code>Airport <\/code>\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>icao<\/code> :<\/p>\n<pre><code class=\"swift\">@Model final class Airport {     @Attribute (.unique) var icao: String     var name: String     var city: String     var state: String     var countryCode: String     var latitude: Double     var longitude: Double     var timezone: String          @Relationship (inverse: \\Flight.origin) var flightsFrom: [Flight]     @Relationship (inverse: \\Flight.destination)  var flightsTo: [Flight] }<\/code><\/pre>\n<p>\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 <code>Airline <\/code>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Relationship<\/code>\u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c &#171;\u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0432\u043d\u0443\u044e&#187; \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044c \u0434\u043b\u044f <code>flights<\/code>  \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 <code>code<\/code>:<\/p>\n<pre><code class=\"swift\">@Model final class Airline {     @Attribute (.unique) var code: String     var name: String     var shortname: String     @Relationship (inverse: \\Flight.airline) var flights: [Flight] }<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0421\u0445\u0435\u043c\u0430 \u0414\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 SwiftData:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f7c\/7ea\/cdd\/f7c7eacdd667ac7e4287217b40f16736.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u0414\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData\" title=\"\u0421\u0445\u0435\u043c\u0430 \u0414\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData\" width=\"1876\" height=\"818\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f7c\/7ea\/cdd\/f7c7eacdd667ac7e4287217b40f16736.png\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0414\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData<\/figcaption><\/div>\n<\/figure>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Transient<\/code> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 <strong>\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e<\/strong> \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430  <code>UI<\/code> \u0438\u043b\u0438 \u0432\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445, \u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442.\u00a0<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0421\u0445\u0435\u043c\u044b \u0414\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 @Attribute <\/h3>\n<p>\u0423 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Attribute<\/code> \u0435\u0441\u0442\u044c  \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><strong>unique:<\/strong>\u00a0\u00a0\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <\/p>\n<\/li>\n<li>\n<p><strong>transient:\u00a0<\/strong>\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438-\u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430<\/p>\n<\/li>\n<li>\n<p><strong>transformable<\/strong>:\u00a0\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u0435\u0436\u0434\u0443 \u0444\u043e\u0440\u043c\u043e\u0439 &#171;\u0432 \u043f\u0430\u043c\u044f\u0442\u0438&#187; \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0439 \u0444\u043e\u0440\u043c\u043e\u0439<\/p>\n<\/li>\n<li>\n<p><strong>externalStorage:<\/strong>\u00a0\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u0430\u043a \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 <\/p>\n<\/li>\n<li>\n<p><strong>encrypt:\u00a0<\/strong>\u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435<\/p>\n<\/li>\n<li>\n<p><strong>preserveValueOnDeletion<\/strong>:\u00a0\u00a0\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 &#171;\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f&#187;, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c-\u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446\u0430<\/p>\n<\/li>\n<li>\n<p><strong>spotlight:<\/strong>\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u043e\u0441\u044c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u043f\u043e\u0438\u0441\u043a\u0430 Spotlight<\/p>\n<\/li>\n<\/ul>\n<h4>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430<\/h4>\n<p>\u041e\u0431\u044a\u0435\u043c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0432\u0430\u0448\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c SwiftData \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0446\u0438\u0438 <code>externalStorage<\/code> \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Attribute<\/code> \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u0432\u043d\u0435:<\/p>\n<pre><code class=\"swift\"> @Attribute(.externalStorage)  var imageData: Data?<\/code><\/pre>\n<h2>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 ModelContainer \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 ModelContext<\/h2>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0421\u0445\u0435\u043c\u0430 \u0414\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430, \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445, \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0441 <code>@Model<\/code>\u0422\u0418\u041f\u0430\u043c\u0438 \u0432 SwiftData \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0432\u0430\u0436\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430: \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>ModelContainer<\/code> \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>ModelContext<\/code>. <\/p>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>ModelContainer<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u201c\u0431\u044d\u043a\u0435\u043d\u0434\u201d \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f <code>@Model <\/code>\u0422\u0418\u041f\u043e\u0432. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>ModelContainer<\/code>, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0432 \u0441\u043f\u0438\u0441\u043e\u043a <code>@Model<\/code> \u0422\u0418\u041f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c.\u00a0<\/p>\n<pre><code class=\"swift\">\/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e @Model \u0422\u0418\u041f\u043e\u0432 let container = try ModelContainer([Airport.self, Airline.self, Flight.self])<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>container<\/code>,  \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 <code>configurations<\/code> \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e <code>URL<\/code>-\u0430\u0434\u0440\u0435\u0441\u0430 \u0438 CloudKit, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0446\u0438\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.\u00a0<\/p>\n<pre><code class=\"swift\">\/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e @Model \u0422\u0418\u041f\u043e\u0432 let container = try ModelContainer(Airport.self, Airline.self, Flight.self)  \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 configurations let container = try ModelContainer(             for: Airport.self, Airline.self, Flight.self,             ModelConfiguration(url: URL(string: \"path\")!)         )  let container = try ModelContainer (for:Airport.self, Airline.self, Flight.self,               configurations: ModelConfiguration (isStoredInMemoryOnly: true))  \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0445\u0435\u043c\u044b schema \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 configurations         let schema = Schema([Airport.self, Airline.self,Flight.self,])         let modelConfiguration = ModelConfiguration(schema: schema,                                        isStoredInMemoryOnly: false)         let container = try ModelContainer(for: schema,                                        configurations: [modelConfiguration])  \/\/ \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 iCloud let container = try ModelContainer(             for: [Airport.self, Airline.self, Flight.self],                 cloudKitContainerIdentifier: \"bestkora.com.flights\"         )<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0448 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>container<\/code> \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 <code>ModelContext<\/code>. <\/p>\n<p>\u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SwiftUI<code> View<\/code> \u0438 <code>Scene<\/code> \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>container<\/code> &#8230;<\/p>\n<pre><code class=\"swift\">import SwiftUI  @main struct SwidtData_AirportApp: App {     var body: some Scene {         WindowGroup {             HomeView()            .constant(true))         }         .modelContainer(for: [Airport.self, Airline.self, Flight.self])     } }<\/code><\/pre>\n<p>&#8230; \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0440\u0435\u0434\u0435 <code>@Environment<\/code> \u0432\u0430\u0448\u0435\u0433\u043e <code>View<\/code>\u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 <code>context<\/code>:\u00a0<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData   struct FlightsView: View {    @Environment(\\.modelContext) private var context    @Query( sort: \\.routeDistance, order: .forward) var flights: [Flight]          var body: some View {         NavigationView {             List {...}             .listStyle(PlainListStyle())             .navigationTitle(\"Flights  (\\(flights.count))\")             .toolbar{                 ToolbarItem(placement: .topBarLeading) {load}                 ToolbarItem(placement: .topBarTrailing) {...}                 ToolbarItem(placement: .topBarTrailing) {...}             }             .sheet(isPresented: $showFilter) {...}         }         .task {             if flights.count == 0 { LoadFlights (context: context).load() }         }         .refreshable {LoadFlights (context: context).load()} \/\/ KIAN     }          var load: some View {         Button(\"Load\") {             LoadFlights (context: context).load()         }     } }<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>ModelContext<\/code> \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0430\u0448\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445 <code>@Model<\/code> \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438. \u041e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0430\u0448\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u0434\u0430\u0436\u0435 \u043e\u0442\u043c\u0435\u043d\u044b \u044d\u0442\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0412\u043d\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 <code>Views<\/code> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>container<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439 (shared) <code>MainActor<\/code> \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>context<\/code>:<\/p>\n<pre><code class=\"swift\">import SwiftData  let context = container.mainContext<\/code><\/pre>\n<p>\u2026 \u0438\u043b\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b\u00a0 <code>context<\/code> \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code>container<\/code>:<\/p>\n<pre><code class=\"swift\">import SwiftData  let context = ModelContext(container)<\/code><\/pre>\n<h2>CRUD\u00a0\u0432 SwiftData<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>ModelContext<\/code>, \u0442\u043e  \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c CRUD (\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 &#8212; <code>Create<\/code>, \u0447\u0442\u0435\u043d\u0438\u0435 &#8212; <code>Read<\/code>, \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f &#8212; <code>Updata<\/code>, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 &#8212; <code>Delete<\/code>) \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>C\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 <code>@Model<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 , \u043a\u0430\u043a \u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 Swift \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>class<\/code>, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 <code>init<\/code>,  \u0437\u0430\u0442\u0435\u043c \u0432\u044b \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435 <code>insert<\/code> \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>ModelContext<\/code>. \u041d\u043e \u043a\u043b\u0430\u0441\u0441  <code>class<\/code> \u0432 Swift, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>struct<\/code>, \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, Xcode \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u0430\u043c \u0432 \u044d\u0442\u043e\u043c \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u0432\u0430\u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u044c <code>init<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 Xcode.<\/p>\n<p>\u041d\u043e \u0442\u043e\u043d\u043a\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>@Model<\/code>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0435\u0439, \u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0434\u0432\u0430 \u0444\u0430\u043a\u0442\u043e\u0440\u0430: <\/p>\n<ul>\n<li>\n<p>\u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c <code>@Model<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 <code>@Model<\/code> \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435,<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d &#8212; \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044c <code>destination: Airport<\/code> \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0440\u0435\u0439\u0441\u0430 <code>Flight<\/code>, \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0435\u0439\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0435\u0439\u0441\u043e\u0432 <code>flightsTo<\/code> \u0434\u043b\u044f \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 <code>destination<\/code>, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u043c\u044b  \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0440\u0435\u0439\u0441 <code>Flight<\/code>, \u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438: \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>origin<\/code>, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u044f<code>destination<\/code> \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e <code>airline<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0443\u044e \u044d\u0442\u043e\u0442 \u0440\u0435\u0439\u0441, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0440\u0435\u0439\u0441 <code>Flight<\/code> \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0440\u0435\u0439\u0441\u0430<code> Flight<\/code> &#8212; <code>init (ident:String)<\/code>\u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>ident<\/code>, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u043b\u0438 \u0438\u043c\u0435\u0442\u044c <code>Optional<\/code> \u0422\u0418\u041f :<\/p>\n<pre><code class=\"swift\">@Model final class Flight {     @Attribute (.unique) var ident: String     var actualOff: Date?     var scheduledOff: Date = Date()     var estimatedOff: Date = Date()     var scheduledOn: Date = Date()     var estimatedOn: Date = Date()     var actualOn: Date?          var aircraftType: String = \"\"     var progressPercent: Int = 0     var status: String = \"\"     var routeDistance: Int = 0     var filedAirspeed: Int = 0     var filedAltitude: Int = 0          var origin: Airport?     var destination: Airport?     var airline: Airline?          init(ident: String) {         self.ident = ident     } }<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0440\u0435\u0439\u0441 <code>Flight<\/code> \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code>ident<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>context:<\/code><\/p>\n<pre><code class=\"swift\">let flight = Flight(ident: ident) context.insert(flight)<\/code><\/pre>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>flight<\/code> \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0430\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 <code>context<\/code>.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0440\u0435\u0439\u0441\u0430 <code>flight<\/code> \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code>ident<\/code>, \u043c\u044b   \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0435\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438 <code>origin<\/code>, <code>destination<\/code> \u0438 <code>airline<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>static<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>func<\/code> <code>update :<\/code><\/p>\n<pre><code class=\"swift\">extension Flight { \/\/--------------- Update ------------------     static func update (from faflight: Arrival, in context: ModelContext) {         if faflight.ident != \"\",            faflight.airlineCode != \"\" &amp;&amp; faflight.airlineCode.count >= 1,            faflight.origin.code != \"\",            faflight.destination.code != \"\" {                     \/\/ \u0438\u0449\u0435\u043c \u0440\u0435\u0439\u0441 flight \u0432 SwiftData \u043f\u043e ident            let flight = self.withIdent(faflight.ident, in: context)                          flight.origin =  Airport.withICAO(faflight.origin.code,                                                context: context)             flight.destination = Airport.withICAO(faflight.destination.code,                                                    context: context)                          flight.actualOff = faflight.actualOff             flight.scheduledOff = faflight.scheduledOff!             flight.estimatedOff = faflight.estimatedOff ?? faflight.scheduledOff!                          flight.scheduledOn = faflight.scheduledOn!             flight.estimatedOn = faflight.estimatedOn ?? faflight.scheduledOn!             flight.actualOn = faflight.actualOn                          flight.aircraftType = faflight.aircraftType ?? \"Unknown\"                          flight.progressPercent = faflight.progressPercent             flight.status = faflight.status             flight.routeDistance = faflight.routeDistance             flight.filedAirspeed = faflight.filedAirspeed ?? 0             flight.filedAltitude = faflight.filedAltitude ?? 0             flight.airline = Airline.withCode(faflight.airlineCode,                                                context: context)         }     }   }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u0434\u0430\u043d\u0438\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>update<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0431\u044b \u043a\u0430\u043a \u0441 \u043d\u043e\u0432\u044b\u043c\u0438, \u0442\u0430\u043a \u0438 \u0441 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0440\u0435\u0439\u0441\u0430\u043c\u0438 <code>flight<\/code>, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 <code>static<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>func<\/code> <code>withIdent<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>Flight<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0449\u0435\u0442 \u0440\u0435\u0439\u0441 <code>flight<\/code> \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code>ident<\/code>, \u0438 \u0435\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0435\u0433\u043e, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0439\u0441 <code>flight<\/code>, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>insert<\/code>:<\/p>\n<pre><code class=\"swift\">static func withIdent(_ ident: String,  in context: ModelContext) -> Flight {         \/\/ \u0438\u0449\u0435\u043c \u0440\u0435\u0439\u0441 flight \u0432 SwiftData \u043f\u043e ident         let flightPredicate = #Predicate&lt;Flight> {             $0.ident == ident         }         let descriptor = FetchDescriptor&lt;Flight>(predicate: flightPredicate)         let results = (try? context.fetch(descriptor)) ?? []                  \/\/ \u0435\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e         if let flight = results.first {             return flight         } else {         \/\/ \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439             let flight = Flight(ident: ident)             context.insert(flight)             return flight         }     }<\/code><\/pre>\n<p>\u041d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>ident<\/code>, \u0438 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430  <code>@Attribute(.unique) var ident: String<\/code>,  \u0430 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 SwiftData \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 iCloud,  \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 <code>@Attribute (.unique)<\/code>. <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u0441 <code>Airport<\/code> \u0438 \u0441 <code>Airline<\/code> ( \u043a\u043e\u0434 \u0432 <a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\">Github<\/a> \u043f\u0440\u043e\u0435\u043a\u0442 <u>SwiftDataEnroute<\/u>).<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0447\u0438\u0442\u0430\u0442\u044c (<code>READ<\/code>) \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 SwiftData :<\/p>\n<pre><code class=\"swift\">let flightPredicate = #Predicate&lt;Flight> {             $0.ident == ident         } let descriptor = FetchDescriptor&lt;Flight>(predicate: flightPredicate) let results = (try? context.fetch(descriptor)) ?? []<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c (<code>CREATE<\/code>) \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b:<\/p>\n<pre><code class=\"swift\">let flight = Flight(ident: ident) context.insert(flight)<\/code><\/pre>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435.<\/em> \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 <code>insert<\/code> SwiftData \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442<code>@Attribute (.unique)<\/code>,  \u0438 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0442\u043e  \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f, \u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f. <\/p>\n<p>\u041c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c (<code>UPDATE<\/code>) \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<pre><code>flight.actualOff = faflight.actualOff flight.scheduledOff = faflight.scheduledOff!<\/code><\/pre>\n<p>\u0423\u0434\u0430\u043b\u0438\u0442\u044c (<code>DELETE<\/code>) \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0439 SwiftData \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e.  \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c <code>ModelContext<\/code> \u201c\u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c\u201d \u0435\u0433\u043e \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f :<\/p>\n<pre><code class=\"swift\">context.delete(flight)<\/code><\/pre>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/em>. \u0412\u0441\u0435 SwiftData \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>context<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442. \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f <code>delete<\/code>:<\/p>\n<pre><code class=\"swift\">private func delete(flight: Flight) {    if let context = flight.context {      context.delete(flight)    } }<\/code><\/pre>\n<p> \u041a\u043e\u0433\u0434\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0430\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.  \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, a \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c <code>ModelContext<\/code> \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044f\u0432\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<code>save<\/code>:<\/p>\n<pre><code class=\"swift\">do {         \/\/ Try to save         try context.save()     } catch {         \/\/ We couldn't save :(         \/\/ Failures include issues such as an invalid unique constraint         print(error.localizedDescription)     }<\/code><\/pre>\n<h3>\u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e\u0432\u044b\u0435 Swift \u0422\u0418\u041f\u044b: Query, Predicate \u0438 FetchDescriptor. <\/h3>\n<p>\u0414\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 SwiftData \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 &#171;\u0447\u0438\u0441\u0442\u043e&#187; Swift \u0422\u0418\u041f\u044b, \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 <code>Predicate<\/code> \u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 <code>FetchDescriptor<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0439 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432 Swift \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 <code>SortDescriptor<\/code>.<\/p>\n<p>\u041d\u043e\u0432\u044b\u0439 \u0432 iOS 17 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 <code>Predicate<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u201c\u0440\u043e\u0434\u043d\u044b\u043c\u0438\u201d \u0422\u0418\u041f\u0430\u043c\u0438 Swift. \u042d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0422\u0418\u041f\u0430 <code>NSPredicate<\/code> \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0422\u0418\u041f\u043e\u0432. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 Xcode, \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044f \u043c\u043e\u0433\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0439\u0441\u044b, \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 San<code> <\/code>Francisco:\u00a0<\/p>\n<pre><code class=\"swift\">\/\/ \u041f\u0440\u0438\u043c\u0435\u0440\u044b Predicate   let sanFranciscoFlightsPredicate =                 #Predicate&lt;Flight> { $0.origin.icao == \"KSFO\"}<\/code><\/pre>\n<p>\u042f \u043c\u043e\u0433\u0443 \u0441\u0443\u0437\u0438\u0442\u044c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e \u0440\u0435\u0439\u0441\u043e\u0432, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 United:<\/p>\n<pre><code class=\"swift\">let sanFranciscoUnitedFlightsPredicate =      #Predicate&lt;Flight> { $0.origin.icao == \"KSFO\" &amp;&amp; $0.airline.code == \"UAL\"}<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0440\u0435\u0439\u0441\u044b, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435:<\/p>\n<pre><code class=\"swift\">let flightsInAirPredicate =                 #Predicate&lt;Flight> { $0.actualOn == nil &amp;&amp; $0.actualOff != nil}<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0439\u0441\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0422\u0418\u041f <code>FetchDescriptor<\/code> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443 \u0438 \u0434\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 <code>ModelContext<\/code> \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u0438 \u0440\u0435\u0439\u0441\u044b:<\/p>\n<pre><code class=\"swift\">let descriptor = FetchDescriptor&lt;Flight> ( predicate:flightsInAirPredicate ) let flightsInAir = try context.fetch(descriptor)<\/code><\/pre>\n<p>\u00a0\u0420\u0430\u0431\u043e\u0442\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <code>FetchDescriptor<\/code>, Swift \u0422\u0418\u041f <code>SortDescriptor<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u201c\u0440\u043e\u0434\u043d\u044b\u0445\u201d \u0422\u0418\u041f\u043e\u0432 Swift \u0438 <code>keypaths<\/code>.<\/p>\n<pre><code class=\"swift\">let descriptor = FetchDescriptor&lt;Flight> ( sort: \\.routeDistance,                                           predicate:flightsInAirPredicate ) let flightsInAir = try context.fetch(descriptor)<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435  \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 <code>FetchDescriptor<\/code>, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 SwiftData, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 <a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2023-10187\/?time=417\" rel=\"noopener noreferrer nofollow\"><u>&#171;Dive Deeper into SwiftData&#187;<\/u><\/a> (\u00ab\u0423\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 SwiftData\u00bb). <\/p>\n<h2>SwiftData \u0438 SwiftUI<\/h2>\n<p>SwiftData \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0430 SwiftUI, \u0438 \u0438\u0445 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. SwiftUI \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SwiftData. \u0411\u0443\u0434\u044c \u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 SwiftData, \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u0430\u0448\u0435\u0433\u043e <code>View<\/code>, \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f <em>Apple<\/em> \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 <strong>API,<\/strong> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438.\u00a0<\/p>\n<p>\u041d\u043e\u0432\u044b\u0435 SwiftUI<code> Scene<\/code> \u0438 <code>View<\/code> \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code>.modelContaner<\/code> \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f SwiftData:<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  @main struct SwidtData_AirportApp: App {     var body: some Scene {         WindowGroup {             HomeView()         }         .modelContainer(for: [Airport.self, Airline.self, Flight.self])     } }<\/code><\/pre>\n<p>\u00a0SwiftData \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432 SwiftUI &#171;\u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430&#187; <code>@Query<\/code>\u00a0\u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u0412 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435  \u043a\u043e\u0434\u0435 \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0440\u0435\u0439\u0441\u044b <code>flights<\/code> \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435:<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  struct FlightsView: View {    @Query private var flights: [Flight]          var body: some View {         NavigationView {             List {                 ForEach ( flights ) { flight in                                       FlightView(flight: flight) }             }             .listStyle(PlainListStyle())             .navigationTitle(\"Flights  (\\(flights.count))\")         }     } } <\/code><\/pre>\n<p><code>@Query<\/code> \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043d\u0430\u043c <code>@FetchRequest<\/code> \u0432 Core Data. \u041e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e. <code>@Query<\/code>\u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#171;\u0436\u0438\u0432\u044b\u043c&#187; \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443 SwiftData, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043d\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430 UI. <code>@Query<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>filter<\/code>, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>sort<\/code>, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<code>order<\/code> \u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e <code>animation<\/code>. \u0412\u043e\u0442 <code>@Query<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0435\u0439\u0441\u043e\u0432 <code>flights<\/code> \u043f\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 <code>routeDistance<\/code> \u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"swift\">@Query( sort: \\.routeDistance, order: .forward) var flights: [Flight]<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 <code>@Query<\/code>\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0439\u0441\u044b <code>flights<\/code> , \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u0421\u0430\u043d-\u0424\u0440\u0430\u043d\u0446\u0438\u0441\u043a\u043e &#171;San Francisco Int&#8217;l&#187; \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 United Airline \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043f\u043e % \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438: <\/p>\n<pre><code class=\"swift\">@Query (         filter:         #Predicate&lt;Flight> { flight in flight.origin.icao == \"KSFO\" &amp;&amp;                               flight.airline.code == \"UAL\"},          sort: \\Flight.progressPercent) var flights: [Flight]<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442  <code>@FetchRequest<\/code> \u0432 Core Data, <code>@Query<\/code>\u0432 SwiftData \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 (Xcode 15.0) \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 <code>filter<\/code> \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 <code>sort<\/code> \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>@State<\/code>\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>@State<\/code>\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>originICAO<\/code> \u0437\u0430\u0434\u0430\u0442\u044c \u043a\u043e\u0434 <code>icao<\/code> \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f&#8230;<\/p>\n<pre><code class=\"swift\">struct FlightsView: View {   @State private var originICAO = \"KSFO\"<\/code><\/pre>\n<p>&#8230; \u0442\u043e \u0432 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0435 <code>.onChange(<\/code>originICAO<code>){...}<\/code> \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>filter<\/code> \u0434\u043b\u044f <code>@Query<\/code>:<\/p>\n<pre><code class=\"swift\">#Predicate&lt;Flight> { flight in flight.origin.icao.contains(originICAO) }<\/code><\/pre>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 <code>init (originICAO: String)<\/code> \u0432\u0430\u0448\u0435\u0433\u043e <code>View<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>originICAO<\/code>\u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e <code>View<\/code>. <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>HomeView<\/code>  \u0441 \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0440\u0435\u0439\u0441\u043e\u0432, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0438 <code>@State<\/code>\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f var<code>originICAO: String?<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0435\u0442 \u043a\u043e\u0434 <code>icao<\/code> \u0434\u043b\u044f \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  struct HomeView: View {     @State private var originICAO : String?          var body: some View {         TabView {             FlightsView(originICAO: $originICAO)                 .tabItem{                     Label(\"Flights\", systemImage: \"airplane\")                     Text(\"Flights\")                 }             AirportsView()                 .tabItem{                     Label(\"Airports\", systemImage: \"globe\")                     Text(\"Airports\")                 }                                               AirlinesView()                 .tabItem{                     Label(\"Airlines\", systemImage: \"airplane.circle\")                     Text(\"Airlines\")                 }         }     } }<\/code><\/pre>\n<p>\u041c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>originICAO<\/code> \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 <code>init (originICAO: Binding&lt;String?>)<\/code> \u043d\u0430\u0448\u0435\u0433\u043e <code>FlightsView<\/code>, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0433\u043e \u0440\u0435\u0439\u0441\u044b <code>flights<\/code>, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>origin<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439:<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  struct FlightsView: View {     @Environment(\\.modelContext) private var context     @Query( sort: \\Flight.routeDistance, order: .forward)                                   var flights: [Flight]          @State private var showFilter = false     @Binding var originICAO: String?          init(originICAO: Binding&lt;String?>) {         self._originICAO = originICAO         guard let icao = originICAO.wrappedValue,icao.count > 0  else {return}         self._flights = Query(filter: #Predicate&lt;Flight> { flight in flight.origin?.icao.contains(icao) ?? false},                                sort: \\.routeDistance, order: .forward)     }   . . . . . . . . . . . . . .<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>originICAO<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 <code>FilterICAOView<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Picker<\/code> \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>airportsFROM<\/code> :<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  struct FilterICAOView: View {     @Query(filter: #Predicate&lt;Airport> { $0.flightsFrom.count > 0 },            sort: \\Airport.name, order: .forward) var airportsFROM: [Airport]     @Binding var originICAO: String?     @Binding var isPresented: Bool     @State private var airportFrom: Airport?              init(originICAO: Binding&lt;String?>, isPresented: Binding&lt;Bool>,           context: ModelContext) { ... }          var body: some View {         NavigationStack {             Form {                     Picker(\"Origin\", selection: $airportFrom) {                         Text(\"Any\").tag(Airport?.none)                         ForEach(airportsFROM) { (airport: Airport?) in                             Text(\"\\(airport?.name ?? \"Any\")\").tag(airport)                         }                     }                     .pickerStyle(.inline)             }             .toolbar{ ... }             .navigationTitle(\"Filter Flights\")         }     }          var cancel: some View { Button(\"Cancel\") { isPresented = false }}          var done: some View { Button(\"Done\") {            originICAO = airportFrom?.icao            isPresented = false         }     } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 <code>icao<\/code> \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 <code>FlightsView<\/code> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 <code>Button(\"Filter\")<\/code>  \u0438 <code>sheet<\/code>:<\/p>\n<pre><code class=\"swift\">struct FlightsView: View {     @Environment(\\.modelContext) private var context     @Query( sort: \\Flight.routeDistance, order: .forward)                                   var flights: [Flight]     @State private var showFilter = false     @Binding var originICAO: String?   . . . . . . . . .   var body: some View {         NavigationView {             List {...}             .listStyle(PlainListStyle())             .navigationTitle(\"Flights  (\\(flights.count) \\(originICAO == nil ? \"\" : originICAO!))\")             .toolbar{                 ToolbarItem(placement: .topBarLeading) {load}                 ToolbarItem(placement: .topBarTrailing) {filter}             }             .sheet(isPresented: $showFilter) {                 FilterICAOView(originICAO:  $originICAO,                                 isPresented: $showFilter,                                 context: context)                     .presentationDetents([.large])             }         }         .task {...}     }          var load: some View {...}          var filter: some View {         Button(\"Filter\") {             self.showFilter = true         }     } }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac1\/144\/06f\/ac114406fcf1bf5a4fee064276fb9131.gif\" alt=\"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e init\" title=\"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e init\" width=\"1500\" height=\"1191\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac1\/144\/06f\/ac114406fcf1bf5a4fee064276fb9131.gif\"\/><\/p>\n<div><figcaption>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <a class=\"mention\" href=\"\/users\/query\">@Query<\/a>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e init<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e <code>@Query<\/code>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 <a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\">Github<\/a>. \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <strong><u>SwiftDataEnroute<\/u><\/strong>.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 <code>FlightsView <\/code>\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0440\u0435\u0439\u0441\u043e\u0432 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>@Query<\/code> \u0432\u0441\u0435 \u0440\u0435\u0439\u0441\u044b <code>flights: [Flight]<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>filter<\/code> \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>flights<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0436\u0435 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 <code>filteredFlights<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 UI:<\/p>\n<pre><code class=\"swift\">struct FlightsView: View {    @Environment(\\.modelContext) private var context    @Query( sort: \\Flight.routeDistance, order: .forward) var flights: [Flight]      @State private var showFilter = false     @State var originICAO: String?          var filteredFlights: [Flight] {         guard  originICAO != nil, originICAO!.count > 0 else {return  flights}         return flights.filter {$0.origin != nil &amp;&amp; $0.origin!.icao.contains(originICAO!)}         }       var body: some View {         NavigationView {             List {                 ForEach (filteredFlights) { flight in FlightView(flight: flight) }             }             .listStyle(PlainListStyle())             .navigationTitle(\"Flights  (\\(filteredFlights.count) \\(originICAO == nil ? \"\" : originICAO!))\")             .toolbar{                 ToolbarItem(placement: .topBarLeading) {load}                 ToolbarItem(placement: .topBarTrailing) {filter}             }             .sheet(isPresented: $showFilter) {                 FilterICAOView(originICAO:  $originICAO,                                 isPresented: $showFilter, context: context)                     .presentationDetents([.large])             }         }         .task {...}     }          var load: some View {...}     var filter: some View {...} }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432<a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\"> Github<\/a> \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <strong><u>SwiftDataEnroute1<\/u><\/strong>.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0439\u0441\u043e\u0432 \u043f\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>origin<\/code> \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>destination<\/code> \u043f\u043e \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <code>airline<\/code> \u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435 <code>Entouter Only<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 <a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\">Github<\/a> \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <strong><u>SwiftData Airport<\/u><\/strong>.<\/p>\n<h2>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u044b #Preview \u0432 Xcode \u0434\u043b\u044f SwiftUI<\/h2>\n<p>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u044b #Preview \u0432 Xcode \u0438\u0433\u0440\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 SwiftUI, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f UI.<\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 #Preview \u0432 SwiftData \u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e <code>ModelContainer<\/code>. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0431\u044b\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0432 \u0432\u0438\u0434\u0435\u043e WWDC 23 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2023\/10154\/?time=530\" rel=\"noopener noreferrer nofollow\">&#171;Build an app with SwiftData&#187;<\/a> (&#171;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SwiftData&#187;). \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>ModelContainer<\/code> \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f #Preview \u0432 SwiftData. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (<code>inMemory<\/code>) \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  @MainActor let previewContainer: ModelContainer = {     do {         let container = try ModelContainer (for:                                  Airport.self, Airline.self, Flight.self,                                             configurations:                                  ModelConfiguration(isStoredInMemoryOnly: true))         )         \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435         SampleData.airportsInsert(context: container.mainContext)         SampleData.airlinesInsert(context: container.mainContext)         SampleData.flightsInsert(context: container.mainContext)         return container     } catch {         fatalError(\"Failed to create preview container\")     } }()  \/\/ airport let previewAirport: Airport = {     MainActor.assumeIsolated {         return Airport.withICAO(\"KSFO\", context: previewContainer.mainContext)     } } ()  \/\/ airline let previewAirline: Airline  = {     MainActor.assumeIsolated {         return Airline.withCode (\"UAL\", context: previewContainer.mainContext)     } } ()<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0410 \u0432\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f #Preview:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">struct SampleData {     \/\/ -----  1 ----     static let airports: [Airport] = {         let airportData1: Airport  = {             var airport =  Airport(icao: \"KSFO\")             airport.latitude = 37.6188056             airport.longitude = -122.3754167             airport.name = \"San Francisco Int'l\"             airport.city = \"San Francisco\"             airport.state = \"CA\"             airport.countryCode = \"US\"             airport.timezone = \"America\/Los_Angeles\"             return airport         } ()         \/\/ -----  2 ----         let airportData2: Airport  = {             var airport =  Airport(icao: \"KJFK\")             airport.latitude = 40.6399278             airport.longitude = -73.7786925             airport.name = \"John F Kennedy Intl\"             airport.city = \"New York\"             airport.state = \"NY\"             airport.countryCode = \"US\"             airport.timezone = \"America\/New_York\"             return airport         } ()         \/\/ -----  3 ----         let airportData3: Airport  = {             var airport =  Airport(icao: \"KPDX\")             airport.latitude = 45.5887089             airport.longitude = -122.5968694             airport.name = \"Portland Intl\"             airport.city = \"Portland\"             airport.state = \"OR\"             airport.countryCode = \"US\"             airport.timezone = \"America\/Los_Angeles\"             return airport         } ()         \/\/ -----  4 ----         let airportData4: Airport  = {             var airport =  Airport(icao: \"KSEA\")             airport.latitude = 47.4498889             airport.longitude = -122.3117778             airport.name = \"Seattle-Tacoma Intl\"             airport.city = \"Seattle\"             airport.state = \"WA\"             airport.countryCode = \"US\"             airport.timezone = \"America\/Los_Angeles\"             return airport         } ()         \/\/ -----  5 ----         let airportData5: Airport  = {             var airport =  Airport(icao: \"KACV\")             airport.latitude = 40.9778333             airport.longitude = -124.1084722             airport.name = \"California Redwood Coast-Humboldt County\"             airport.city = \"Arcata\/Eureka\"             airport.state = \"CA\"             airport.countryCode = \"US\"             airport.timezone = \"America\/Los_Angeles\"             return airport         } ()         return [airportData1,airportData2, airportData3, airportData4, airportData5]     }()          static let airlines: [Airline] = {         \/\/ -----  1 ----         let airlineData1: Airline = {             var airline =  Airline(code: \"UAL\")             airline.name = \"United Air Lines Inc.\"             airline.shortname = \"United\"             return airline         } ()         \/\/ -----  2 ----         let airlineData2: Airline = {             var airline =  Airline(code: \"SKW\")             airline.name = \"SkyWest Airlines\"             airline.shortname = \"SkyWest\"             return airline         } ()                  return [airlineData1, airlineData2]     }()          static func flightsInsert(context: ModelContext) {         \/\/ -----  1 ----         let flight = Flight(ident: \"UAL1780\")         context.insert(flight)         flight.origin =  Airport.withICAO(\"KPDX\", context: context)         flight.destination = Airport.withICAO(\"KSFO\", context: context)                  flight.actualOff = ISO8601DateFormatter().date(from:\"2022-01-26T16:22:56Z\")         flight.scheduledOff = ISO8601DateFormatter().date(from:\"2022-01-26T16:10:00Z\")!         flight.estimatedOff = ISO8601DateFormatter().date(from:\"2022-01-26T16:22:56Z\")!                  flight.scheduledOn = ISO8601DateFormatter().date(from:\"2022-01-26T17:13:00Z\")!         flight.estimatedOn = ISO8601DateFormatter().date(from:\"2022-01-26T17:41:00Z\")!         \/\/  flight.actualOn = faflight.actualOn                  flight.aircraftType = \"A319\"                  flight.progressPercent = 100         flight.status = \"\u041f\u0440\u0438\u0437\u0435\u043c\u043b. \/ \u0412\u044b\u0440\u0443\u043b\u0438\u0432.\"         flight.routeDistance = 551         flight.filedAirspeed = 432         flight.filedAltitude = 350         flight.airline = Airline.withCode(\"UAL\", context: context)                  \/\/ -----  2 ----         let flight1 = Flight(ident: \"UAL1541\")         context.insert(flight1)         flight1.origin =  Airport.withICAO(\"KSFO\", context: context)         flight1.destination = Airport.withICAO(\"KSEA\", context: context)                  flight1.scheduledOff = ISO8601DateFormatter().date(from:\"2022-01-26T17:41:00Z\")!         flight1.estimatedOff = ISO8601DateFormatter().date(from:\"2022-01-26T17:41:00Z\")!                  flight1.scheduledOn = ISO8601DateFormatter().date(from:\"2022-01-26T18:59:00Z\")!         flight1.estimatedOn = ISO8601DateFormatter().date(from:\"2022-01-26T19:18:00Z\")!                  flight1.aircraftType = \"A319\"                  flight1.progressPercent = 0         flight1.status = \"\u0412\u044b\u0440\u0443\u043b\u0438\u0432. \/ \u041f\u043e\u0441\u0430\u0434\u043a\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u0430\"         flight1.routeDistance = 680         flight1.filedAirspeed = 446         flight1.filedAltitude = 380         flight1.airline = Airline.withCode(\"UAL\", context: context)                  \/\/ -----  3 ----         let flight3 = Flight(ident: \"SKW5892\")         context.insert(flight3)         flight3.origin =  Airport.withICAO(\"KSFO\", context: context)         flight3.destination = Airport.withICAO(\"KACV\", context: context)                  flight3.actualOff    = ISO8601DateFormatter().date(from:\"22022-08-25T06:07:15Z\")         flight3.scheduledOff = ISO8601DateFormatter().date(from:\"2022-08-25T05:46:00Z\")!         flight3.estimatedOff = ISO8601DateFormatter().date(from:\"22022-08-25T06:07:15Z\")!                  flight3.scheduledOn = ISO8601DateFormatter().date(from:\"2022-08-25T06:29:00Z\")!         flight3.estimatedOn = ISO8601DateFormatter().date(from:\"2022-08-25T06:48:00Z\")!                  flight3.aircraftType = \"E75L\"                  flight3.progressPercent = 61         flight3.status = \"\u0412 \u043f\u0443\u0442\u0438 \/ \u041f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e\"         flight3.routeDistance = 269         flight3.filedAirspeed = 413         flight3.filedAltitude = 260         flight3.airline = Airline.withCode(\"SKW\", context: context)     }          static func airportsInsert(context: ModelContext) {         airports.forEach{context.insert($0)}     }     static func airlinesInsert(context: ModelContext) {         airlines.forEach{context.insert($0)}     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e <code>View<\/code> \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 #Preview:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/67e\/e83\/1d4\/67ee831d4beef4808cc05093b20beca5.png\" alt=\"#Preview \u0434\u043b\u044f HomeView\" title=\"#Preview \u0434\u043b\u044f HomeView\" width=\"2196\" height=\"1422\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/67e\/e83\/1d4\/67ee831d4beef4808cc05093b20beca5.png\"\/><\/p>\n<div><figcaption>#Preview \u0434\u043b\u044f HomeView<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/81e\/110\/7e5\/81e1107e5608c1c5b69e50e1be5796f3.png\" alt=\"#Preview \u0434\u043b\u044f AirportDetail\" title=\"#Preview \u0434\u043b\u044f AirportDetail\" width=\"1964\" height=\"1414\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/81e\/110\/7e5\/81e1107e5608c1c5b69e50e1be5796f3.png\"\/><\/p>\n<div><figcaption>#Preview \u0434\u043b\u044f AirportDetail<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d1b\/d64\/839\/d1bd64839fdad594262e82781dea2902.png\" alt=\"#Preview \u0434\u043b\u044f AirportMap\" title=\"#Preview \u0434\u043b\u044f AirportMap\" width=\"2046\" height=\"1416\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d1b\/d64\/839\/d1bd64839fdad594262e82781dea2902.png\"\/><\/p>\n<div><figcaption>#Preview \u0434\u043b\u044f AirportMap<\/figcaption><\/div>\n<\/figure>\n<h2>\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 JSON \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 JSON \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Swift \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 (Swift Concurrency).<\/p>\n<h3>MainActor<\/h3>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u0445 \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 <code>Codable<\/code> \u041c\u043e\u0434\u0435\u043b\u0438 : <code>AirportInfo<\/code>, <code>AirlineInfo<\/code>, <code>FlightsInfo<\/code> (\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a JSON \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u0441\u0430\u0439\u0442\u00a0<a href=\"https:\/\/ru.flightaware.com\/\" rel=\"noopener noreferrer nofollow\">FlightAware<\/a>) , \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>MainActor<\/code> \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 SwiftData \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0430\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 <code>context<\/code>. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430\u0445 :<\/p>\n<pre><code class=\"swift\">    func getAirportsAsync(_ nameJSON: String) async {         var airports: [AirportInfo]? = []         do {             airports = try await FromJSONAPI.shared.fetchAsyncThrows (nameJSON)             if let airportsFA = airports {                 await MainActor.run {                     for airport in airportsFA {                         Airport.update(from: airport, context: context)                     }                 }             }         } catch {             print (\" In file \\(nameJSON) \\(error)\")         }     }<\/code><\/pre>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0438 \u0440\u0435\u0439\u0441\u043e\u0432 \u0438 \u0432\u0441\u0451 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 <code>async<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>asyncLoadMainActor ()<\/code> &#8230;<\/p>\n<pre><code class=\"swift\">struct LoadFlights {     var context : ModelContext     var flightsFromFA = FlightsInfo (                             arrivals: [], departures: [],                             scheduledArrivals: [], scheduledDepartures: [])     init(context: ModelContext){         self.context = context     }     \/\/----------------------------------------------ASYNC AIRLINE     func airLinesAsync (_ nameJSON: String) async { ... }     \/\/----------------------------------------------ASYNC AIRPORT     func airportsAsync(_ nameJSON: String) async { ... }     \/\/----------------------------------------------ASYNC FLIGHT     func flightsAsync(_ nameJSON: String) async  { ... }     \/\/--------------------------------------------------------- Main Actor     func asyncLoadMainActor () async {         await airLinesAsync(FilesJSON.airlinesFile)      \/\/-----Airlines         await airportsAsync(FilesJSON.airportsFile)      \/\/-----Airport         await flightsAsync(FilesJSON.flightsFileKSFO4)   \/\/-----Flights SFO4         await flightsAsync(FilesJSON.flightsFileKORD1)   \/\/-----Flights ORD1     }     \/\/-------------------------------------------------------------------- }<\/code><\/pre>\n<p>&#8230; \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0435 <code>.task<\/code>, \u0435\u0441\u043b\u0438 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 <code>Button (\"Load\")<\/code>:<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  struct FlightsView: View {     @Environment(\\.modelContext) private var context     @Query var flights: [Flight]          @Binding var flightFilter: FlightFilter     @Binding var sorting: FlightSorting     @State private var showFilter = false          init (flightFilter: Binding&lt;FlightFilter>,           flightSorting: Binding&lt;FlightSorting>) { ... }          var body: some View {         NavigationView {             List { ... }             .listStyle(PlainListStyle())             .navigationTitle(\"Flights  (\\(flights.count))\")             .toolbar{ ... }             .sheet(isPresented: $showFilter) { ... }         }         .task {             if flights.count == 0 {                   await LoadFlights (context: context).asyncLoadMainActor ()             }         }     }          var load: some View {         Button(\"Load\") {             Task {               await LoadFlights (context: context).asyncLoadMainActor ()             }         }     }          var filter: some View { ... } }<\/code><\/pre>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0439\u0441\u043e\u0432 (349), \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 (203) \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 (84) \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0447\u0442\u043e \u0432\u044b \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 <code>Main Queue<\/code>,  \u0438 \u0432\u0441\u0435 \u0436\u0435 \u043e\u043d\u0430 \u0435\u0441\u0442\u044c. <\/p>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430 <code>MainActor<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 <u>SwiftDataEnroute<\/u>, <u>SwiftDataEnroute1<\/u> \u0438 <u>SwiftData Airport<\/u> \u043d\u0430 <a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\">Github<\/a>.<\/p>\n<h3>Background actor<\/h3>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0439\u0442\u0438 \u0435\u0449\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 SwiftData \u043d\u0430 \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (background queue). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c <code>actor LoadModelActor: ModelActor<\/code>, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>ModelContainer<\/code>, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>context<\/code> \u0434\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>DefaultModelExecutor<\/code>:<\/p>\n<pre><code class=\"swift\">import Foundation import SwiftData  actor LoadModelActor: ModelActor {     let modelContainer: ModelContainer     let modelExecutor: any ModelExecutor        lazy var flightTaskKSFO  =               Task {await flightsAsync (FilesJSON.flightsFileKSFO4)}     lazy var flightTaskKORD  =                Task {await flightsAsync (FilesJSON.flightsFileKORD1)}     lazy var airportTask  =                Task {await airportsAsync (FilesJSON.airportsFile) }     lazy var airlineTask  =                Task {await airLinesAsync (FilesJSON.airlinesFile) }           init(modelContainer: ModelContainer) {         self.modelContainer = modelContainer         let context = ModelContext(modelContainer)         modelExecutor = DefaultSerialModelExecutor(modelContext: context)       }          func flightsAsync(_ nameJSON: String) async  { ... }          func airportsAsync(_ nameJSON: String) async {         var airports: [AirportInfo]? = []         do {             airports = try await FromJSONAPI.shared.fetchAsyncThrows (nameJSON)             if let airportsFA = airports {                     for airport in airportsFA {                         Airport.update(from: airport, context: context)                     }                 context.saveContext()             }         } catch {             print (\" In file \\(nameJSON) \\(error)\")         }     }          func airLinesAsync(_ nameJSON: String) async { ... } }<\/code><\/pre>\n<p> \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435,  \u0434\u043b\u044f <code>actor<\/code> \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 <code>context.saveContext()<\/code>, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u043b\u0438\u0441\u044c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043d\u0430  UI (\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 SwiftData).<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <code>async<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>func asyncLoad () async<\/code><strong> <\/strong>\u0432 \u043d\u0430\u0448 <code>FlightsView<\/code> :<\/p>\n<pre><code class=\"swift\">private func asyncLoad () async {  \/\/ actor             let actor = LoadModelActor(container: context.container)             await actor.airportTask.finish()             await actor.airlineTask.finish()             await actor.flightTaskKSFO.finish()             await actor.flightTaskKORD.finish()     }  <\/code><\/pre>\n<p>&#8230; \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0451, \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e,  \u0432 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0435 <code>.task<\/code>, \u0435\u0441\u043b\u0438 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 <code>Button (\"Load\")<\/code>:<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  struct FlightsView: View {     @Environment(\\.modelContext) private var context     @Query var flights: [Flight]          @Binding var flightFilter: FlightFilter     @Binding var sorting: FlightSorting     @State private var showFilter = false          init (flightFilter: Binding&lt;FlightFilter>,           flightSorting: Binding&lt;FlightSorting>) { ... }          var body: some View {         NavigationView { ... }         .task {             if flights.count == 0 {                  await asyncLoad () \/\/ background actor             }         }     }          var load: some View {         Button(\"Load\") {             Task {                await asyncLoad () \/\/ background actor             }         }     }      private func asyncLoad () async { ... }\/\/ actor     var filter: some View { ... } }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <strong><u>SwiftData Airport1<\/u><\/strong> , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 background, \u043c\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 \u043f\u0443\u0441\u0442\u0443\u044e \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0443 <code>Flights<\/code>, \u0438\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043c\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0438 <code>Airports<\/code> \u0438 <code>Airlines<\/code>, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0442\u0430\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0443 <code>Flights<\/code> \u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0442\u0430\u043c \u0443\u0436\u0435 349 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0439\u0441\u043e\u0432. \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 <code>Main Queue<\/code> \u043d\u0435\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb5\/38e\/6c5\/cb538e6c562f5686a6b7119b344c8f97.gif\" alt=\"\u041d\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 Main Queue\" title=\"\u041d\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 Main Queue\" width=\"696\" height=\"386\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb5\/38e\/6c5\/cb538e6c562f5686a6b7119b344c8f97.gif\"\/><\/p>\n<div><figcaption>\u041d\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 Main Queue<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430 <code>background<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <strong><u>SwiftData Airport1<\/u><\/strong> <code>\u043d\u0430<\/code> <a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\">Github<\/a>.<\/p>\n<h3>@Model Codable<\/h3>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0439\u0442\u0438 \u0435\u0449\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>Codable <\/code>SwiftData <code>@Model<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>Airport<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 <code>@Model<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0aa\/d6c\/cb3\/0aad6ccb3086484b7612dc0d05d410cf.png\" alt=\"Codable \" title=\"Codable \" width=\"1388\" height=\"592\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0aa\/d6c\/cb3\/0aad6ccb3086484b7612dc0d05d410cf.png\"\/><\/p>\n<div><figcaption>Codable <a class=\"mention\" href=\"\/users\/model\">@Model<\/a><\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 &#171;\u0422\u0418\u041f <code>Airport<\/code> \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c <code>Decodable<\/code> \u0438 <code>Encodable<\/code>&#171;, \u0445\u043e\u0442\u044f \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Airport<\/code> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <code>Codable<\/code>, \u0438 \u0435\u0441\u043b\u0438 \u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Model<\/code>, \u043c\u044b \u0431\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u044d\u0442\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>Codable<\/code>.  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0431\u0435\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 SwiftData <code>@Model<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <code>Codable <\/code>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u041f\u0440\u0430\u0432\u0434\u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <code>Codable <\/code>\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043d, \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 &#171;\u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438&#187; \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0430\u043c\u0438 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f <code>@Model<\/code> \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>Airport<\/code>\u0438 <code>Airline:<\/code><\/p>\n<details class=\"spoiler\">\n<summary>@Model final class Airport: Codable<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">@Model final class Airport: Codable{      @Attribute (.unique) var icao: String      var name: String = \"\"      var city: String = \"\"      var state: String = \"\"      var countryCode: String = \"\"      var latitude: Double = 0.0      var longitude: Double = 0.0      var timezone: String = \"\"            @Relationship (inverse: \\Flight.origin)                                    var flightsFrom: [Flight] = []      @Relationship (inverse: \\Flight.destination)                                     var flightsTo: [Flight] = []            init(icao: String) {          self.icao = icao      }          enum CodingKeys: String, CodingKey {             case airportCode  \/\/  icao             case name             case city             case state             case countryCode             case latitude             case longitude             case timezone         }                  required init(from decoder: Decoder) throws {             let container = try decoder.container(keyedBy: CodingKeys.self)             self.icao = try container.decode(String.self, forKey: .airportCode)             self.name = try container.decode(String.self, forKey: .name)             self.city = try container.decode(String.self, forKey: .city)             self.state = try container.decode(String.self, forKey: .state)             self.countryCode = try container.decode(String.self, forKey: .countryCode)             self.latitude = try container.decode(Double.self, forKey: .latitude)             self.longitude = try container.decode(Double.self, forKey: .longitude)             self.timezone = try container.decode(String.self, forKey: .timezone)         }                  func encode(to encoder: Encoder) throws {           \/\/ TODO: Handle encoding if you need to here         } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>Flight<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 <code>icao<\/code> \u043a\u043e\u0434\u044b \u0434\u043b\u044f \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>origin<\/code> \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>destination<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u043a\u043e\u0434\u044b \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>icaoOrigin: String<\/code>  \u0438 <code>icaoDestination: String<\/code>&#8230;  <\/p>\n<details class=\"spoiler\">\n<summary>@Model final class Flight: Codable <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">\/\/ MARK: - @Model Flight @Model final class Flight: Codable {     @Attribute (.unique) var ident: String          var actualOff: Date?     var scheduledOff: Date     var estimatedOff: Date     var scheduledOn: Date     var estimatedOn: Date     var actualOn: Date?          var aircraftType: String     var progressPercent: Int     var status: String     var routeDistance: Int     var filedAirspeed:Int     var filedAltitude: Int          var origin: Airport     var destination: Airport     var airline: Airline          \/\/------- for from JSON ----     var icaoOrigin: String     var icaoDestination: String     var codeAirLine: String     \/\/--------------------------     init(ident: String) {         self.ident = ident     }     \/\/ ----- implementation of Codable ---     enum CodingKeys: String, CodingKey {         case ident         case actualOff         case scheduledOff         case estimatedOff                  case actualOn         case scheduledOn         case estimatedOn                  case aircraftType         case progressPercent         case status         case routeDistance         case filedAirspeed         case filedAltitude                  case origin         case destination         }                  required init(from decoder: Decoder) throws {             let container = try decoder.container(keyedBy: CodingKeys.self)             self.ident = try container.decode(String.self, forKey: .ident)             self.actualOff = try container.decode(Date?.self, forKey: .actualOff)             self.scheduledOff = try container.decode(Date.self, forKey: .scheduledOff)             self.estimatedOff = try! container.decode(Date?.self, forKey: .estimatedOff) ?? self.scheduledOff             self.actualOn = try container.decode(Date?.self, forKey: .actualOn)             self.scheduledOn = try container.decode(Date.self, forKey: .scheduledOn)             self.estimatedOn = try! container.decode(Date?.self, forKey: .estimatedOn) ?? self.scheduledOn                          self.aircraftType = try container.decode(String?.self, forKey: .aircraftType) ?? \"Unknown\"             self.progressPercent = try container.decode(Int.self, forKey: .progressPercent)             self.status = try container.decode(String.self, forKey: .status)             self.routeDistance = try container.decode(Int.self, forKey: .routeDistance)             self.filedAirspeed = try container.decode(Int?.self, forKey: .filedAirspeed) ?? 0             self.filedAltitude = try container.decode(Int?.self, forKey: .filedAltitude) ?? 0             let dictionaryOrigin: [String: String?] = try container.decode(Dictionary&lt;String, String?>.self, forKey: .origin)             self.icaoOrigin = dictionaryOrigin [\"code\"]!!             let dictionaryDestination: [String: String?]  = try container.decode(Dictionary&lt;String, String?>.self, forKey: .destination)             self.icaoDestination =  dictionaryDestination[\"code\"]!!             self.codeAirLine =  String(ident.prefix(while: { !$0.isNumber }))                     }                  func encode(to encoder: Encoder) throws {           \/\/ TODO: Handle encoding if you need to here         }     \/\/--------------------------------------------- }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0430 \u043f\u043e\u0442\u043e\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 <code>context<\/code> \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u044b:<\/p>\n<pre><code class=\"swift\">func flightsAsyncCodable (_ nameJSON: String) async  {         var flights: FlightsCodable?         do {             flights = try await FromJSONAPI.shared.fetchAsyncThrows (nameJSON)             if  let flightsFromFA = flights  {                 let flightsFA = (flightsFromFA.arrivals)                 + (flightsFromFA.departures )                 + (flightsFromFA.scheduledArrivals )                 + (flightsFromFA.scheduledDepartures)                                       for flightFA in flightsFA {                         flightFA.origin = Airport.withICAO(flightFA.icaoOrigin, context: context)                         flightFA.destination = Airport.withICAO(flightFA.icaoDestination, context: context)                         flightFA.airline = Airline.withCode(flightFA.codeAirLine, context: context)                         context.insert(flightFA)                         \/\/ Flight.update(from: flightFA, in: context)                     }                 context.saveContext()             }         } catch {             print (\" In file \\(nameJSON) \\(error)\")         }     }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430 <code>background<\/code> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430<code>Codable<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <strong><u>SwiftData Airport2<\/u><\/strong> <code>\u043d\u0430<\/code> <a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\">Github<\/a>.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>SwiftData, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e Swift, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 Core Data, \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u0430\u043a SwiftData \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0421\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 <code>@Model<\/code>, <code>@Attribute<\/code>, <code>@Relationship<\/code>\u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e <strong>\u0432 \u043a\u043e\u0434\u0435<\/strong> \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 Swift  \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 Swift \u0422\u0418\u041f\u044b, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>ModelContainer<\/code> \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <code>ModelContext<\/code>\u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f  CRUD (\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u0435\u043d\u0438\u0435, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435) \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0430\u043a \u043d\u0430 <code>Main Queue<\/code>, \u0442\u0430\u043a \u0438 \u043d\u0430 <code>Background Queue<\/code>.<\/p>\n<p>\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432 <code>Predicate<\/code> \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 <code>Query<\/code> \u0432 SwiftData, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043c\u043e\u0449\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0430\u0448\u0438\u0445 Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u041f\u043e\u043a\u0430, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b <code>Predicate<\/code>\u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>SwiftData \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0430 SwiftUI, \u0438 \u0438\u0445 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0412 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0430 SwiftUI \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u044e\u0430\u043d\u0441\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 &#171;\u0436\u0438\u0432\u043e\u0433\u043e&#187; \u0437\u0430\u043f\u0440\u043e\u0441\u0430 <code>@Query<\/code> \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code>ModelContainer<\/code> \u0434\u043b\u044f #Previews \u0432 Xcode.<\/p>\n<p>\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>@Model<\/code> \u043a\u043b\u0430\u0441\u0441\u044b <code>Codable<\/code> (\u0445\u043e\u0442\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438) \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c JSON \u0434\u0430\u043d\u043d\u044b\u0435  \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0418 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 SwiftData \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u043c\u0435\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 <code>@Query<\/code> \u043a\u0430\u043a <code>@FetchRequest<\/code>\u0432 Core Data<\/p>\n<\/li>\n<li>\n<p> \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 <code>#Predicate<\/code><\/p>\n<\/li>\n<li>\n<p> \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 <code>Codable<\/code> \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043b\u044f <code>@Model<\/code> \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043c\u0435\u044f \u043c\u043d\u043e\u0433\u043e\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Core Data \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u043e SwiftData \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0435\u0433\u043a\u043e \u0438 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e, \u0438 \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u043e\u043c SwiftData \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0433\u043e\u0434\u044b.<\/p>\n<p>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0443 SwiftData \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0441\u0441\u0438\u0439 \u043d\u0430 WWDC 2023: <\/p>\n<p><a href=\"https:\/\/developer.apple.com\/wwdc23\/10187https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;ved=2ahUKEwjF69eHy9yAAxWrTkEAHRjQAYoQtwJ6BAgREAI&amp;url=https%3A%2F%2Fdeveloper.apple.com%2Fvideos%2Fplay%2Fwwdc2023%2F10187%2F&amp;usg=AOvVaw0UzV2kPgIQsrd2j93Q8XSF&amp;opi=89978449\" rel=\"noopener noreferrer nofollow\"><u>Meet SwiftData &#8212; WWDC23  &#8212; Video\u00a0<\/u><\/a><\/p>\n<p><a href=\"https:\/\/developer.apple.com\/wwdc23\/10195https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;ved=2ahUKEwjF69eHy9yAAxWrTkEAHRjQAYoQtwJ6BAgOEAI&amp;url=https%3A%2F%2Fdeveloper.apple.com%2Fvideos%2Fplay%2Fwwdc2023%2F10195%2F&amp;usg=AOvVaw3M6-iymgvxYrLBhznEOCh4&amp;opi=89978449\" rel=\"noopener noreferrer nofollow\"><u>Model your schema with SwiftData &#8212; WWDC23 -Video\u00a0<\/u><\/a><\/p>\n<p><a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;ved=2ahUKEwjF69eHy9yAAxWrTkEAHRjQAYoQtwJ6BAgQEAI&amp;url=https%3A%2F%2Fdeveloper.apple.com%2Fvideos%2Fplay%2Fwwdc2023%2F10154%2F&amp;usg=AOvVaw2k3bU5mPARxK4RXvQVxdz4&amp;opi=89978449\" rel=\"noopener noreferrer nofollow\">Build an app with SwiftData &#8212; WWDC23 &#8212; Video<\/a><\/p>\n<p><a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;ved=2ahUKEwjF69eHy9yAAxWrTkEAHRjQAYoQtwJ6BAgPEAI&amp;url=https%3A%2F%2Fdeveloper.apple.com%2Fvideos%2Fplay%2Fwwdc2023%2F10189%2F&amp;usg=AOvVaw0rK9SKTEDBllRRt8wqy66D&amp;opi=89978449\" rel=\"noopener noreferrer nofollow\">Migrate to SwiftData &#8212; WWDC23 &#8212; Videos\u00a0<\/a><\/p>\n<p><a href=\"https:\/\/developer.apple.com\/wwdc23\/10196\" rel=\"noopener noreferrer nofollow\"><u>Dive deeper into SwiftData<\/u><\/a><\/p>\n<p>\u0421\u043e\u0432\u0435\u0442\u0443\u044e \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 Karin Prater (\u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441 \u0445\u043e\u0440\u043e\u0448\u0438\u043c\u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438):<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.swiftyplace.com\/blog\/modeling-data-in-swiftdata\" rel=\"noopener noreferrer nofollow\">Modeling Data in SwiftData<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.swiftyplace.com\/blog\/swiftui-apps-with-swiftdata\" rel=\"noopener noreferrer nofollow\">Introduction to Data Persistence in SwiftUI with SwiftData<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.swiftyplace.com\/blog\/crud-in-swift-data\" rel=\"noopener noreferrer nofollow\">Data Handling in SwiftData: Create, Read, Update, Delete<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.swiftyplace.com\/blog\/fetch-and-filter-in-swiftdata\" rel=\"noopener noreferrer nofollow\">How to fetch and filter data in SwiftData with Predicates<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.swiftyplace.com\/blog\/swiftdata-stack-understanding-containers\" rel=\"noopener noreferrer nofollow\">SwiftData Stack: Understanding Schema, Container &amp; Context<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.swiftyplace.com\/blog\/how-to-convert-a-coredata-project-to-swiftdata\" rel=\"noopener noreferrer nofollow\">How to convert a CoreData project to SwiftData<\/a><\/p>\n<p>Background actor<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/useyourloaf.com\/blog\/swiftdata-background-tasks\/\" rel=\"noopener noreferrer nofollow\">SwiftData Background Tasks<\/a><\/p>\n<p>Codable<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.donnywals.com\/making-your-swiftdata-models-codable\/\" rel=\"noopener noreferrer nofollow\">Making your SwiftData models Codable<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=SCU5tOgztVo\" rel=\"noopener noreferrer nofollow\">Easily Preload SwiftData Using JSON On Your App\u2019s First Launch\u00a0<\/a><\/p>\n<\/li>\n<\/ul>\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\/articles\/740720\/\"> https:\/\/habr.com\/ru\/articles\/740720\/<\/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<figure class=\"full-width\"><\/figure>\n<p>SwiftData \u0434\u0435\u0431\u044e\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0430 <a href=\"https:\/\/developer.apple.com\/wwdc23\/10187\" rel=\"noopener noreferrer nofollow\">WWDC 2023 <\/a>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Core Data. \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 Apple \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445,  \u0431\u0435\u0441\u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c iCloud, \u0412\u0435\u0441\u044c API SwiftData \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e Swift. SwiftData \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e <code>iOS 17<\/code> \u0438 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044f Xcode<code> 15.0<\/code><\/p>\n<p>\u0412 SwiftData, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u0430, \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 Core Data, \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0421\u0445\u0435\u043c\u0443 (\u0438\u043b\u0438 \u041c\u043e\u0434\u0435\u043b\u044c \u0414\u0430\u043d\u043d\u044b\u0445) \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e  <strong>\u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435<\/strong> \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0435 Swift  \u043a\u043b\u0430\u0441\u0441\u044b <code>class<\/code> \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 Swift \u0422\u0418\u041f\u044b , <code>Codable<\/code> \u0422\u0418\u041f\u044b  \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 Swift  \u043a\u043b\u0430\u0441\u0441\u044b  \u0421\u0445\u0435\u043c\u044b.  \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a <code>Optional<\/code> \u0422\u0418\u041f\u044b, \u0442\u0430\u043a \u0438 \u041d\u0415-<code>Optional<\/code>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 Swift \u043a\u043b\u0430\u0441\u0441\u044b \u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, <em>Apple<\/em> \u0434\u0430\u043b\u0430 \u043d\u0430\u043c &#171;\u0432\u043e\u043b\u0448\u0435\u0431\u043d\u0443\u044e \u043f\u0430\u043b\u043e\u0447\u043a\u0443&#187; \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432,  \u0441\u0430\u043c\u044b\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <code>@Model<\/code>.   <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c <code>@Model<\/code>\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u00a0Swift \u043a\u043b\u0430\u0441\u0441\u044b, \u0442\u043e  \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e  \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043d\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0438\u0445 <code>Observable, Hashable<\/code> \u0438<code> Identifiable<\/code>, \u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u0445 \u0432 SwiftUI, \u0438\u0431\u043e \u043d\u043e\u0432\u044b\u0439 \u0432 iOS 17 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<code>Observable<\/code>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0432\u0430\u043c &#171;\u0436\u0438\u0432\u043e\u0435&#187; \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 UI \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u0430\u0448\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430 <code>Identifiable <\/code>\u0438<code> Hashable<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0431\u0435\u0441\u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043a\u0430\u0445<code>ForEach.<\/code><\/p>\n<p>\u0412 SwiftData, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Core Data, \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u041c\u043e\u0434\u0435\u043b\u0438 \u0414\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 &#171;\u0437\u0430\u043a\u0443\u043b\u0438\u0441\u043d\u043e\u0439&#187; \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 Objective-C \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/667874\/\" rel=\"noopener noreferrer nofollow\">\u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Swift<\/a>. \u0412 SwiftData<code> - \u0432\u0441\u0451<\/code>\u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 SwiftData \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Core Data, \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0435\u0451 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0430 UI. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 &#171;\u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430&#187; <code>@Query<\/code> , \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 <code>Predicate<\/code> (\u0442\u043e \u0435\u0441\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445) \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 <code>SoreDescriptor<\/code>. \u041d\u043e\u0432\u044b\u0439 \u043c\u043e\u0449\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 <code>Predicate<\/code> \u0432\u044b\u0433\u043e\u0434\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 <code>NSPredicate<\/code> Core Data \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Swift, \u0430 \u043d\u0435 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e <a href=\"https:\/\/nspredicate.xyz\/coredata.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u0443\u044e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 <\/a>. <\/p>\n<p>SwiftData \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d \u0442\u0430\u043a\u0438\u043c\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043a\u0430\u043a Swift \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 Swift 5.9 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0441\u0430\u043c\u043e\u0433\u043e <em>Apple<\/em>,  \u201c\u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e\u0435\u201d  \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. SwiftData \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 SwiftUI \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 CloudKit \u0438 Widgets.\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0447\u043d\u0435\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e SwiftData, \u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u0434\u0430\u0436\u0435 &#171;\u0434\u0443\u0445\u0430&#187; Core Data, \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c Swifty.  <em>Apple<\/em> \u043d\u0430\u0441\u0442\u0430\u0438\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e SwiftData &#8212; \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0442 Core Data \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043d\u0430\u043c \u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 SwiftData &#171;\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u043e\u0439&#187; Core Data, \u043d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a, \u0442\u043e \u043e\u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e, \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e  \u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430,  \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 &#171;\u0440\u043e\u0434\u043d\u043e\u0439&#187; c\u0440\u0435\u0434\u0435 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Swift.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0432\u0430\u043c, \u043a\u0430\u043a <\/p>\n<ul>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0421\u0445\u0435\u043c\u0443  \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData, <\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c CRUD \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (Create &#8212;  \u0421\u043e\u0437\u0434\u0430\u0442\u044c, Read &#8212; \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, Update &#8212; \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c, Delete &#8212; \u0443\u0434\u0430\u043b\u0438\u0442\u044c), <\/p>\n<\/li>\n<li>\n<p>\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b <code>Query<\/code> \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 <code>Predicate<\/code>, <\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c &#171;\u0436\u0438\u0432\u043e\u0439&#187; \u0437\u0430\u043f\u0440\u043e\u0441 <code>@Query<\/code>\u0432 SwiftUI \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c,<\/p>\n<\/li>\n<li>\n<p>\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e &#171;\u0437\u0430\u043a\u0430\u0447\u0430\u0442\u044c&#187; JSON  \u0434\u0430\u043d\u043d\u044b\u0435  \u0432 SwiftData \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0431\u0435\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (UI).<\/p>\n<\/li>\n<\/ul>\n<h2>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0421\u0445\u0435\u043c\u044b \u0414\u0430\u043d\u043d\u044b\u0445 \u0432 SwiftData<\/h2>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/cs193p.sites.stanford.edu\/2020\" rel=\"noopener noreferrer nofollow\">Enroute \u0438\u0437 \u0441\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u0438\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 CS193P 2020<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0441\u0435 \u0440\u0435\u0439\u0441\u044b <code>Flight<\/code>, \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u0432\u0443\u043c\u044f \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430\u043c\u0438:  \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u043c \u0427\u0438\u043a\u0430\u0433\u043e &#171;Chicago O&#8217;Hare Intl&#187; \u0438 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u043c \u0421\u0430\u043d-\u0424\u0440\u0430\u043d\u0446\u0438\u0441\u043a\u043e &#171;San Francisco Int&#8217;l&#187;. \u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u044d\u0442\u0438\u0445 \u0440\u0435\u0439\u0441\u0430\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043c\u043d\u043e\u044e \u0441 \u0441\u0430\u0439\u0442\u0430\u00a0<a href=\"https:\/\/ru.flightaware.com\/\" rel=\"noopener noreferrer nofollow\">FlightAware<\/a> \u0432 JSON \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041c\u044b &#171;\u0437\u0430\u043a\u0430\u0447\u0430\u0435\u043c&#187; \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438 \u0441\u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0440\u0435\u0439\u0441\u0430\u0445, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430\u0445 \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 &#8230; <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0440\u0435\u0439\u0441\u043e\u0432, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u0438 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p>&#8230; \u043d\u043e \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432. <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0439\u0441\u044b <code>Flights<\/code> \u043f\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f &#8212; <code>destination<\/code>, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0443 \u0432\u044b\u043b\u0435\u0442\u0430 &#8212; <code>origin<\/code>,  \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 &#8212; <code>airline<\/code> \u0438  \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435 &#8212; <code>Enroute Only<\/code>:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0439\u0441\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Picker<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>destination<\/code> \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0439 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u0432 \u0427\u0438\u043a\u0430\u0433\u043e &#8212; &#171;Chicago O&#8217;Hare Intl&#187;,  \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0439\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435 <code>Enroute Only<\/code>:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u044b\u0431\u043e\u0440 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Picker<\/figcaption><\/div>\n<\/figure>\n<p>&#8230; \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0439\u0441\u043e\u0432, \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435  &#171;Done&#187;:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0431\u043e\u0440\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u044b \u043f\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u0431\u0443\u043a\u0432\u0430\u043c \u0438\u043c\u0435\u043d\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &#171;San &#187; \u0438, \u0432\u044b\u0431\u0440\u0430\u0432 \u0438\u0437 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &#171;San Francisco Int&#8217;l&#187; (\u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0439 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u0421\u0430\u043d-\u0424\u0440\u0430\u043d\u0446\u0438\u0441\u043a\u043e), \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0451\u043c: \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0440\u0435\u0439\u0441\u044b, \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0435  \u0438 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0435 \u0432 \u044d\u0442\u043e\u0442 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u043e\u0438\u0441\u043a \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0439\u0441\u044b \u043d\u0443\u0436\u043d\u044b\u043c \u043d\u0430\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0435\u0442\u0430 <code>distance<\/code> \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f: <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0420\u0435\u0439\u0441\u043e\u0432 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0435\u0442\u0430 \u0432 \u0443\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0442\u043e\u0447\u043d\u043e <a href=\"https:\/\/&quot;San%20Francisco%20Int'l&quot;\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Enroute, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c Core Data<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c <u>SwiftData Airport<\/u> \u00a0\u0432<a href=\"https:\/\/github.com\/BestKora\/SwiftDataExperiments\" rel=\"noopener noreferrer nofollow\">\u00a0Github<\/a>.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043d\u0430\u0448\u0435\u0439 \u0421\u0445\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0439\u0441\u00a0<code>Flight<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 <code>airline:<\/code> <code>Airline<\/code> \u043c\u0435\u0436\u0434\u0443 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u043c  \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f  <code>origin: Airport<\/code> \u0438 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u043e\u043c  \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>destination: Airport<\/code>. \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438<code>Swift<\/code> \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438: <code>Flight<\/code>,<code>Airport<\/code> \u0438 <code>Airline<\/code> :<\/p>\n<pre><code class=\"swift\">class Flight {     var ident: String          var actualOff: Date?     var scheduledOff: Date     var estimatedOff: Date     var scheduledOn: Date     var estimatedOn: Date     var actualOn: Date?          var progressPercent: Int     var status: String     var routeDistance: Int     var filedAirspeed:Int     var filedAltitude: Int          var origin: Airport     var destination: Airport     var airline: Airline      var aircraftType: String }<\/code><\/pre>\n<p>\u0423 \u0440\u0435\u0439\u0441\u0430 <code>Flight<\/code> \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u0435\u0439\u0441\u0430 <code>ident<\/code>, \u0432\u0440\u0435\u043c\u044f \u0432\u0437\u043b\u0435\u0442\u0430 (\u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e <code>scheduledOff<\/code>, \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435  <code>estimatedOff<\/code> \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <code>actualOff<\/code>), \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u044f (\u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e <code>scheduledOn<\/code>, \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435  <code>estimatedOn<\/code> \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <code>actualOn<\/code>), \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>origin: Airport<\/code>, \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442 \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u044f<code>destination: Airport<\/code>, \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f <code>airline: Airline<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f \u044d\u0442\u043e\u0442 \u0440\u0435\u0439\u0441, \u0442\u0438\u043f \u0441\u0430\u043c\u043e\u043b\u0435\u0442\u0430 <code>aircraftTyp\u0435<\/code>. \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>routeDistance<\/code> \u043c\u0435\u0436\u0434\u0443 \u043f\u0443\u043d\u043a\u0442\u0430\u043c\u0438 \u043e\u0442\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c <code>filedAirspeed<\/code>, \u0432\u044b\u0441\u043e\u0442\u0430 <code>filedAltitude<\/code>  \u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 <code>progressPercent<\/code>.<\/p>\n<pre><code class=\"swift\">class Airport {     var icao: String     var name: String     var city: String     var countryCode: String     var latitude: Double     var longitude: Double     var timezone: String       var flightsTo: [Flight] = []     var flightsFrom: [Flight] = [] }<\/code><\/pre>\n<p>\u0410\u044d\u0440\u043e\u043f\u043e\u0440\u0442 <code>Airport<\/code>\u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u0434 <code>icao<\/code>, \u0438\u043c\u044f <code>name<\/code>, \u0433\u043e\u0440\u043e\u0434 <code>city<\/code>, \u0448\u0442\u0430\u0442 <code>state<\/code>, \u043a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u044b <code>countryCode<\/code> , \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <code>latitude<\/code> \u0438 <code>longitude<\/code> \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f , \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u044f\u0441  <code>timezone<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0440\u0435\u0439\u0441\u0430\u0445, \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0445 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430 <code>flightsFrom<\/code>, \u0438 \u043e \u0440\u0435\u0439\u0441\u0430\u0445, \u043f\u0440\u0438\u0431\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0432 \u044d\u0442\u043e\u0442 \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442, <code>flightsTo<\/code>.<\/p>\n<pre><code class=\"swift\">class Airline {     var code: String     var name: String     var shortName: String       var flights: [Flight] = [] }<\/code><\/pre>\n<p>\u0410\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f <code>Airline<\/code>\u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u0434 <code>code<\/code>, \u0438\u043c\u044f <code>name<\/code>, \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0438\u043c\u044f  <code>shortName<\/code>. \u041d\u0430\u0441 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0441\u0435\u0445 \u0440\u0435\u0439\u0441\u0430\u0445 <code>flights<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0439 \u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439. <\/p>\n<p>\u0412 SwiftData \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434 Swift \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 <code>@Model<\/code>, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c &#171;\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u0443\u044e&#187; \u041c\u043e\u0434\u0435\u043b\u044c \u0414\u0430\u043d\u043d\u044b\u0445,  \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f &#171;\u0440\u0435\u0439\u0441\u044b&#187; <code>Flight<\/code>,   &#171;\u0430\u0432\u0438\u0430\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438&#187; <code>Airline<\/code> \u0438 &#171;\u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u044b&#187;<code>Airport<\/code>, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044f\u043c\u0438:\u00a0<\/p>\n<pre><code class=\"swift\">import SwiftUI import SwiftData  @Model final class Flight {     var ident: String          var actualOff: Date?     var scheduledOff: Date     var estimatedOff: Date     var scheduledOn: Date     var estimatedOn: Date     var actualOn: Date?          var progressPercent: Int     var status: String     var routeDistance: Int     var filedAirspeed:Int     var filedAltitude: Int          var origin: Airport     var destination: Airport     var airline: Airline      var aircraftType: String }<\/code><\/pre>\n<pre><code class=\"swift\">@Model final class Airport {     var icao: String     var name: String     var city: String     var state: String     var countryCode: String     var latitude: Double     var longitude: Double     var timezone: String          var flightsFrom: [Flight] = []     var flightsTo: [Flight] = [] }   @Model class Airline {     var code: String     var name: String     var shortName: String       var flights: [Flight] = [] }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0443<code>@Model<\/code> SwiftData \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0441\u0435 <strong>\u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435<\/strong> \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 Swift \u043a\u043b\u0430\u0441\u0441\u0430  \u0432 <strong>\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e<\/strong> \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.  <\/p>\n<p> \u0415\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u0435\u0442 <strong>Value <\/strong>\u0422\u0418\u041f, SwiftData \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a <u>\u0430\u0442\u0440\u0438\u0431\u0443\u0442<\/u>. \u0422\u0430\u043a\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0433\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f:<\/p>\n<ul>\n<li>\n<p>\u0431\u0430\u0437\u043e\u0432\u044b\u0435 <strong>Value<\/strong> \u0422\u0418\u041f\u044b (<code>String<\/code>, <code>Int<\/code> \u0438 <code>Float<\/code> \u0438 \u0442.\u0434.)<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 <strong>Value<\/strong> \u0422\u0418\u041f\u044b :<\/p>\n<ul>\n<li>\n<p>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>struct<\/code><\/p>\n<\/li>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>enum<\/code><\/p>\n<\/li>\n<li>\n<p><code>Codable<\/code> \u0422\u0418\u041f\u044b<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 <strong>Value<\/strong> \u0422\u0418\u041f\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><code>\u0415\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e<\/code> \u0438\u043c\u0435\u0435\u0442 \u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0439 <strong>Reference<\/strong> \u0422\u0418\u041f (\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>class<\/code>), \u0442\u043e SwiftData \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442  \u0435\u0433\u043e \u043a\u0430\u043a <u>\u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044c<\/u>. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438:<\/p>\n<ul>\n<li>\n<p>\u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 <code>@Model<\/code>\u0422\u0418\u041f\u0430\u043c\u0438  <\/p>\n<\/li>\n<li>\n<p>\u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438<code>@Model<\/code>\u0422\u0418\u041f\u043e\u0432 <\/p>\n<\/li>\n<\/ul>\n<h2>\u041c\u0430\u043a\u0440\u043e\u0441\u044b @Attribute, @Relationship \u0438 @Transient<\/h2>\n<p> <code>@Model<\/code>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435  \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0430\u0448\u0435\u0433\u043e Swift \u043a\u043b\u0430\u0441\u0441\u0430 \u043b\u0438\u0431\u043e \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u043b\u0438\u0431\u043e \u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438,  \u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c. \u041d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a SwiftData \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f  &#171;\u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0435 \u043f\u0430\u043b\u043e\u0447\u043a\u0438&#187; (\u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b) \u0438  \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430  <code>@Model<\/code> \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>@Attribute<\/code><\/p>\n<\/li>\n<li>\n<p><code>@Relationship<\/code><\/p>\n<\/li>\n<li>\n<p><code>@Transient<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e  \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>@Attribute<\/code> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,  \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0440\u0435\u0439\u0441\u0430 <code>ident<\/code>: <\/p>\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-381847","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/381847","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=381847"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/381847\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=381847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=381847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=381847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}