{"id":4143,"date":"2019-04-10T14:47:54","date_gmt":"2019-04-10T14:47:54","guid":{"rendered":"https:\/\/blog.jetbrains.com\/objc\/?p=6968"},"modified":"2019-06-07T09:21:27","modified_gmt":"2019-06-07T09:21:27","slug":"appcode-2019-1-release","status":"publish","type":"appcode","link":"https:\/\/blog.jetbrains.com\/zh-hans\/appcode\/2019\/04\/appcode-2019-1-release","title":{"rendered":"AppCode 2019.1 is here!"},"content":{"rendered":"<p>Please welcome our first major update this year, AppCode 2019.1!<\/p>\n<p>Read on to learn about new Swift support features, code resolution and navigation improvements, new debug actions and settings, IDE themes and more!<\/p>\n<p><img decoding=\"async\" alt=\"Splash\" width=\"800\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/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.1<\/a><\/p>\n<p><!--more--><\/p>\n<h1 id=\"swift\">Swift<\/h1>\n<h2 id=\"swift_support\">Swift 5 support <\/h2>\n<p>AppCode 2019.1 supports all changes introduced in Swift 5:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0200-raw-string-escaping.md\" target=\"_blank\" rel=\"noopener\">SE-0200<\/a> Raw text literals<\/li>\n<li><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0213-literal-init-via-coercion.md\" target=\"_blank\" rel=\"noopener\">SE-0213<\/a> Literal initialization via coercion<\/li>\n<li><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0216-dynamic-callable.md\" target=\"_blank\" rel=\"noopener\">SE-0216<\/a> Dynamic callables<\/li>\n<li><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0224-ifswift-lessthan-operator.md\" target=\"_blank\" rel=\"noopener\">SE-0224<\/a> Support &#8216;less than&#8217; operator in compilation conditions<\/li>\n<li><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0227-identity-keypath.md\" target=\"_blank\" rel=\"noopener\">SE-0227<\/a> Identity key path<\/li>\n<li><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0228-fix-expressiblebystringinterpolation.md\" target=\"_blank\" rel=\"noopener\">SE-0228<\/a> Fix <code>ExpressibleByStringInterpolation<\/code><\/li>\n<li><a href=\"https:\/\/github.com\/apple\/swift-evolution\/blob\/master\/proposals\/0230-flatten-optional-try.md\" target=\"_blank\" rel=\"noopener\">SE-0230<\/a> Flatten nested optionals resulting from <code>try?<\/code><\/li>\n<\/ul>\n<h2 id=\"rename\">Rename<\/h2>\n<p>The <strong>Rename<\/strong> refactoring now works correctly for super and overridden methods in Swift.<\/p>\n<h2 id=\"go_to_declaration\">Go To Declaration<\/h2>\n<p>Simple actions are not that simple if you look at them through the lens of an IDE. When you invoke the <strong>Go To Declaration<\/strong> action (<code>\u2318B<\/code> or <code>\u2318Click<\/code>) on class initializer, you expect to jump to the actual class declaration. That\u2019s what you\u2019re used to doing in Xcode. But isn\u2019t it useful to be able to jump directly to the initializer\u2019s declaration? <\/p>\n<p>In AppCode 2018.3.x, the <strong>Go To Declaration<\/strong> action always led to the <code>init<\/code> method declaration, which wasn\u2019t very useful for most. We decided to change this behavior but simultaneously keep the ability to jump to the initializer declaration. Now navigation works in the following way: to jump to the class declaration, place the caret before the parentheses and press <code>\u2318B<\/code> (or <code>\u2318Click<\/code> on the class name). To jump to the initializer declaration, place the caret inside the parentheses:<\/p>\n<p><img decoding=\"async\" alt=\"Go to Declaration\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-gotodeclaration@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-gotodeclaration@2x.png\"\/><\/p>\n<h2 id=\"move_statement\">Move Statement<\/h2>\n<p>You can move any code line up\/down using <code>\u21e7\u2325\u2191<\/code>\/<code>\u2193<\/code> shortcuts. Now the same is possible in Swift for loops, switches, conditional statements, methods, functions, and more. Set the caret at the beginning of the code statement or the function declaration, and press <code>\u21e7\u2318\u2191<\/code>\/<code>\u2193<\/code> to move it:<\/p>\n<p><img decoding=\"async\" alt=\"Move Statement\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-move_statement@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-move_statement@2x.png\"\/><\/p>\n<h2 id=\"multiline_strings\">Multiline strings<\/h2>\n<p>Got a string literal that\u2019s too long to fit on one line? AppCode is here to help \u2013 press <code>\u23ce<\/code> to convert it to a multiline string:<\/p>\n<p><img decoding=\"async\" alt=\"Multiline strings\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-multiline@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-multiline@2x.png\"\/><\/p>\n<h1 id=\"code_resolution\">Code resolution<\/h1>\n<p>When you select the simulator in your IDE, it should resolve all the entities using SDK versions for the simulator; the same is true for the device. For a long time, AppCode only resolved code entities using the device SDKs. This was causing the following problems:<\/p>\n<ul>\n<li>The SourceKit inspection sometimes worked incorrectly because of the wrong paths in compiler arguments. For example, a \u201cNo such module\u201d error was shown, or no warnings and errors were displayed.<\/li>\n<li>Project sources from <code>DerivedSources<\/code> directory were not resolved.<\/li>\n<\/ul>\n<p>These issues should now be fixed. <\/p>\n<h1 id=\"objective_c_c_cpp\">Objective-C\/C\/C++<\/h1>\n<p>AppCode now respects your preferred naming scheme for Objective-C\/C\/C++. The selected settings will be used in code completion, code generation, refactorings, and quick-fixes. Select from the predefined schemes, or configure your style manually in <code>Preferences | Editor | Code Style | C\/C++\/Objective-C | Naming Convention<\/code>:<\/p>\n<p><img decoding=\"async\" alt=\"Naming convention\" width=\"670\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-convention@2x.png\"\/><\/p>\n<h1 id=\"run_and_debug\">Run and Debug<\/h1>\n<h2 id=\"attach_to_device_process\">Attach to device process<\/h2>\n<p>Ever spot a problem when running your application, but without an active debug session? That\u2019s when you want to attach the debugger to the running process and zero in on the issue. This used to be possible only for simulator processes, but now we also have real devices covered too:<\/p>\n<p><img decoding=\"async\" alt=\"Attach to device process\" width=\"455\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-attach@2x.png\"\/><\/p>\n<h2 id=\"application_language_and_region\">Application language and region<\/h2>\n<p>We\u2019ve been working to improve our run configurations, and this update adds application language and region settings:<\/p>\n<p><img decoding=\"async\" alt=\"Application language and region\" width=\"455\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-region@2x.png\"\/><\/p>\n<h2 id=\"run_to_cursor\">Run to Cursor<\/h2>\n<p>Using the <strong>Run to Cursor<\/strong> action (<code>\u2325F9<\/code>) you can move the current execution position right where the cursor is. In AppCode 2019.1, you can do it also by clicking on the line number:<\/p>\n<p><img decoding=\"async\" alt=\"Mute variables\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-runtocursor@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-runtocursor@2x.png\"\/><\/p>\n<h2 id=\"mute_variables\">Mute variables<\/h2>\n<p>The debugger shows you all of the local variables and always recalculates their values for each step. However, sometimes you want to quickly step through the code and have only some<em> <\/em>of the variables loaded and calculated. Now you can mute variables using the context menu in the <strong>Debug<\/strong> tool window, and when appropriate use the <strong>Load<\/strong> action to show the values of the specific variables you need:<\/p>\n<p><img decoding=\"async\" alt=\"Mute variables\" width=\"456\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-mute_variables@2x.gif\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-mute_variables@2x.png\"\/><\/p>\n<h1 id=\"build\">Build <\/h1>\n<p>We\u2019ve fixed several issues in Xcode integration and made incremental builds in AppCode fast again.<\/p>\n<h1 id=\"ide_themes\">IDE themes<\/h1>\n<p>If bundled <strong>Light<\/strong> and <strong>Darcula<\/strong> themes are not enough for you, we now have several new IDE themes in our <a href=\"https:\/\/plugins.jetbrains.com\/search?tags=Theme\" target=\"_blank\" rel=\"noopener\">plugin repository<\/a>:<\/p>\n<p><img decoding=\"async\" alt=\"Dark Purple theme\" width=\"670\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-dark@2x.png\"\/><\/p>\n<p>You can create your own IDE <a href=\"http:\/\/www.jetbrains.org\/intellij\/sdk\/docs\/reference_guide\/ui_themes\/themes_intro.html\" target=\"_blank\" rel=\"noopener\">theme plugin<\/a> with a custom set of colors and even icons!<\/p>\n<h1 id=\"recent_locations\">Recent locations<\/h1>\n<p>AppCode has dozens of navigation features, some of which let you navigate to recent items in your project your code, such as:<\/p>\n<ul>\n<li>Recent Files (<code>\u2318E<\/code>)<\/li>\n<li>Switcher (<code>\u2303\u21e5<\/code>)<\/li>\n<li>Jump to Last Edit Location (<code>\u21e7\u2318\u232b<\/code>)<\/li>\n<\/ul>\n<p>Welcome the new member of the \u201crecent\u201d actions family \u2013 the <strong>Recent Locations<\/strong> (<code>\u2303\u21e7E<\/code>) popup, which shows recently visited locations as code snippets:<\/p>\n<p><img decoding=\"async\" alt=\"Recent Locations\" width=\"456\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2019\/04\/objc-recent_locations@2x.png\"\/><\/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!<\/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.1<\/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":4121,"comment_status":"open","ping_status":"open","template":"","categories":[89],"tags":[744,748,751,752,749,477,671,746],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/appcode\/4143"}],"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=4143"}],"version-history":[{"count":0,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/appcode\/4143\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/media\/4121"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/media?parent=4143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/categories?post=4143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/tags?post=4143"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/cross-post-tag?post=4143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}