{"id":4239,"date":"2019-12-04T15:39:39","date_gmt":"2019-12-04T15:39:39","guid":{"rendered":"https:\/\/blog.jetbrains.com\/objc\/?p=7191"},"modified":"2020-01-30T11:24:34","modified_gmt":"2020-01-30T11:24:34","slug":"appcode-2019-3-is-here","status":"publish","type":"appcode","link":"https:\/\/blog.jetbrains.com\/zh-hans\/appcode\/2019\/12\/appcode-2019-3-is-here","title":{"rendered":"AppCode 2019.3 Is Here With Faster Code Highlighting, Completion, and Navigation, Improved Swift Support, New Swift Intentions and Build Messages, and Mac Catalyst Support!"},"content":{"rendered":"<p>Please welcome our special, performance-focused update \u2013 AppCode 2019.3!<\/p>\n<p><img decoding=\"async\" alt=\"Cover\" width=\"800\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-blog@2x.png\"\/><\/p>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/objc\/download\/\" target=\"_blank\" rel=\"noopener\"><i class=\"download-icon\"><\/i>Download AppCode 2019.3<\/a><\/p>\n<p><!--more--><\/p>\n<h2 id=\"swift\">Swift<\/h2>\n<h3 id=\"performance\">Performance<\/h3>\n<p>We promised to dedicate this release to performance improvements, and here they are:<\/p>\n<ul>\n<li>Highlighting, code completion, and navigation in pure Swift and mixed projects should work a lot faster compared to AppCode 2019.2.<\/li>\n<li>We\u2019ve boosted caching so that \u201cProcessing Swift Modules\u201d should be much faster compared to previous AppCode versions.<\/li>\n<\/ul>\n<p>Some major improvements started during this release are still in progress and scheduled for the next release. We\u2019re staying on course and our main focus areas for 2020.1 are, again, performance boosts and language support. <\/p>\n<h3 id=\"language_support\">Language Support<\/h3>\n<p>AppCode 2019.3 brings support for the following Swift 5.1 features:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0244-opaque-result-types.md\" target=\"_blank\" rel=\"noopener\">SE-0244<\/a>: Opaque result types<\/li>\n<li>Property wrappers: resolve for arguments (<a href=\"https:\/\/youtrack.jetbrains.com\/issue\/OC-18766\" target=\"_blank\" rel=\"noopener\">OC-18766<\/a>)<\/li>\n<li>Completion for <a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0252-keypath-dynamic-member-lookup.md\" target=\"_blank\" rel=\"noopener\">SE-0252<\/a> (Key path member lookup)<\/li>\n<li>Highlighting for <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/OC-19021\" target=\"_blank\" rel=\"noopener\">parameter attributes<\/a><\/li>\n<\/ul>\n<h3 id=\"new_intentions\">New Intentions<\/h3>\n<p>A whole heap of new Swift intentions are here to boost your productivity:<\/p>\n<ul>\n<li>Split \/ join variable declaration and assignment:<img decoding=\"async\" alt=\"Split \/ join variable declaration and assignment\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-split_decl_assignment@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-split_decl_assignment@2x.png\"\/><\/li>\n<li>Split variable declarations with multiple elements:<img decoding=\"async\" alt=\"Split variable declarations with multiple elements\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-split_multiple.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-split_multiple.png\"\/><\/li>\n<li>Split \/ join nested <code>if<\/code>\/<code>else<\/code> statements:<img decoding=\"async\" alt=\"Split \/ join nested if\/else statements:\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-merge_if@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-merge_if@2x.png\"\/><\/li>\n<li>Flip comparisons and binary expressions:<img decoding=\"async\" alt=\"Flip comparisons and binary expressions\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-flip@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-flip@2x.png\"\/><\/li>\n<li>Invert <code>if<\/code> condition:<br \/>\n<img decoding=\"async\" alt=\"Invert if\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-invert@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-invert@2x.png\"\/><\/li>\n<li>Merge \/ split conditions:<br \/>\n<img decoding=\"async\" alt=\"Split \/ merge conditions\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-merge_conditions@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-merge_conditions@2x.png\"\/><\/li>\n<li>De Morgan\u2019s Laws:<br \/>\n<img decoding=\"async\" alt=\"De Morgan's Laws\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-demorgan@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-demorgan@2x.png\"\/><\/li>\n<\/ul>\n<h3 id=\"code_generation\">Code Generation<\/h3>\n<p>We\u2019ve added two new options to help you generate Swift code: <code>Prefer Void over ()<\/code> and <code>Prefer explicit return<\/code>. Find them in <code>Editor | Code Style | Swift | Code Generation | General<\/code>.<\/p>\n<h3 id=\"code_formatting\">Code Formatting<\/h3>\n<p>New useful code formatting options are here:<\/p>\n<ul>\n<li>Keep simple property blocks with <code>willSet<\/code>\/<code>didSet<\/code> on one line (<code>Preferences | Editor | Code Style | Swift | Wrapping and Braces | Keep when reformatting | Methods and functions in one line<\/code>).<\/li>\n<li>Keep empty type declarations on one line (<code>Preferences | Editor | Code Style | Swift | Wrapping and Braces | Keep when reformatting | Empty type declarations in one line<\/code>).<\/li>\n<\/ul>\n<h3 id=\"alternative_swift_toolchains\">Alternative Swift Toolchains<\/h3>\n<p>Are you working with the Swift <a href=\"https:\/\/www.tensorflow.org\/swift\" target=\"_blank\" rel=\"noopener\">Tensorflow<\/a> toolchain or another custom Swift toolchain? Now we correctly load all the code constructs for custom Swift toolchains and use them for building, running, debugging, and testing. <\/p>\n<h2 id=\"build_messages\">Build Messages<\/h2>\n<p>We\u2019ve fixed dozens of UX issues by reworking the <strong>Messages<\/strong> tree, which now shows the same information as Xcode does:<\/p>\n<p><img decoding=\"async\" alt=\"Build messages\" width=\"455\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-build_messages@2x.png\"\/><\/p>\n<p>The build progress bar now shows accurately how long it\u2019s going to take to compile your application: <\/p>\n<p><img decoding=\"async\" alt=\"Build messages progress\" width=\"455\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-build_messages_progress@2x.png\"\/><\/p>\n<p>The message filter is simplified and now offers the same options as Xcode does: <em>All Issues<\/em>, <em>Errors and Warnings<\/em>, and <em>Errors Only<\/em>.<\/p>\n<p><img decoding=\"async\" alt=\"Build messages filter\" width=\"455\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/11\/objc-build_messages_filter@2x.png\"\/><\/p>\n<h2 id=\"mac_catalyst_support\">Mac Catalyst Support<\/h2>\n<p>Code assistance, build, run, and debugging now work for Mac Catalyst projects.<\/p>\n<p>That\u2019s it! Explore all the new features in detail on <a href=\"https:\/\/www.jetbrains.com\/objc\/whatsnew\/\" target=\"_blank\" rel=\"noopener\">our website<\/a> and start your free 30-day evaluation to try them in action!<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/objc\/download\/\" target=\"_blank\" rel=\"noopener\"><i class=\"download-icon\"><\/i>Download AppCode 2019.3<\/a><\/p>\n<p><em>Your AppCode Team<\/em><br \/>\n<em>JetBrains<\/em><br \/>\n<em>The Drive to Develop<\/em><\/p>\n","protected":false},"author":437,"featured_media":4217,"comment_status":"open","ping_status":"open","template":"","categories":[89],"tags":[775,780,741,781,477,671,768],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/appcode\/4239"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/appcode"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/types\/appcode"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/users\/437"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/comments?post=4239"}],"version-history":[{"count":0,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/appcode\/4239\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/media\/4217"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/media?parent=4239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/categories?post=4239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/tags?post=4239"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/cross-post-tag?post=4239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}