1"use strict";(self.webpackChunkcodeandweb=self.webpackChunkcodeandweb||[]).push([[15065],{4693:function(e){e.exports=JSON.parse('{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/6314ea15e7d57f2d51405a9ce31a4e93/daadc/Xcode-Tutorial-Dependencies-2%402x.png","srcSet":"/static/6314ea15e7d57f2d51405a9ce31a4e93/b91ad/Xcode-Tutorial-Dependencies-2%402x.png 206w,\\n/static/6314ea15e7d57f2d51405a9ce31a4e93/e8a64/Xcode-Tutorial-Dependencies-2%402x.png 412w,\\n/static/6314ea15e7d57f2d51405a9ce31a4e93/daadc/Xcode-Tutorial-Dependencies-2%402x.png 824w","sizes":"(min-width: 824px) 824px, 100vw"},"sources":[{"srcSet":"/static/6314ea15e7d57f2d51405a9ce31a4e93/8d90e/Xcode-Tutorial-Dependencies-2%402x.webp 206w,\\n/static/6314ea15e7d57f2d51405a9ce31a4e93/e9bec/Xcode-Tutorial-Dependencies-2%402x.webp 412w,\\n/static/6314ea15e7d57f2d51405a9ce31a4e93/96c93/Xcode-Tutorial-Dependencies-2%402x.webp 824w","type":"image/webp","sizes":"(min-width: 824px) 824px, 100vw"}]},"width":824,"height":470}')},7093:function(e){e.exports=JSON.parse('{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/cd3b40ab4c00cc3ed27c1462fc497b30/9229e/Xcode-Tutorial-ProjectStructure.png","srcSet":"/static/cd3b40ab4c00cc3ed27c1462fc497b30/3b1d2/Xcode-Tutorial-ProjectStructure.png 159w,\\n/static/cd3b40ab4c00cc3ed27c1462fc497b30/452da/Xcode-Tutorial-ProjectStructure.png 317w,\\n/static/cd3b40ab4c00cc3ed27c1462fc497b30/9229e/Xcode-Tutorial-ProjectStructure.png 634w","sizes":"(min-width: 634px) 634px, 100vw"},"sources":[{"srcSet":"/static/cd3b40ab4c00cc3ed27c1462fc497b30/3434f/Xcode-Tutorial-ProjectStructure.webp 159w,\\n/static/cd3b40ab4c00cc3ed27c1462fc497b30/0eb0b/Xcode-Tutorial-ProjectStructure.webp 317w,\\n/static/cd3b40ab4c00cc3ed27c1462fc497b30/18928/Xcode-Tutorial-ProjectStructure.webp 634w","type":"image/webp","sizes":"(min-width: 634px) 634px, 100vw"}]},"width":634,"height":604}')},49776:function(e){e.exports=JSON.parse('{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/4320ffa5e2b874fb64fb5eda2cc7786e/92d15/Xcode-Tutorial-ExternalBuildSystem%402x.png","srcSet":"/static/4320ffa5e2b874fb64fb5eda2cc7786e/8bc9b/Xcode-Tutorial-ExternalBuildSystem%402x.png 374w,\\n/static/4320ffa5e2b874fb64fb5eda2cc7786e/96f2c/Xcode-Tutorial-ExternalBuildSystem%402x.png 747w,\\n/static/4320ffa5e2b874fb64fb5eda2cc7786e/92d15/Xcode-Tutorial-ExternalBuildSystem%402x.png 1494w","sizes":"(min-width: 1494px) 1494px, 100vw"},"sources":[{"srcSet":"/static/4320ffa5e2b874fb64fb5eda2cc7786e/2c8c6/Xcode-Tutorial-ExternalBuildSystem%402x.webp 374w,\\n/static/4320ffa5e2b874fb64fb5eda2cc7786e/f010d/Xcode-Tutorial-ExternalBuildSystem%402x.webp 747w,\\n/static/4320ffa5e2b874fb64fb5eda2cc7786e/3e033/Xcode-Tutorial-ExternalBuildSystem%402x.webp 1494w","type":"image/webp","sizes":"(min-width: 1494px) 1494px, 100vw"}]},"width":1494,"height":1078}')},70426:function(e,t,a){a.r(t),a.d(t,{Head:function(){return x},default:function(){return y}});var n=a(28453),r=a(96540),c=a(32532);const s=e=>{let{alt:t,className:n}=e;return r.createElement(c.S,{alt:t,className:n,style:{maxWidth:"634px"},imgStyle:{objectFit:"contain"},src:"./Xcode-Tutorial-ProjectStructure.png",__imageData:a(7093)})},i=e=>{let{alt:t,className:n}=e;return r.createElement(c.S,{alt:t,className:n,style:{maxWidth:"412px"},imgStyle:{objectFit:"contain"},src:"./[email protected]",__imageData:a(4693)})},l=e=>{let{alt:t,className:n}=e;return r.createElement(c.S,{alt:t,className:n,style:{maxWidth:"1283px"},imgStyle:{objectFit:"contain"},src:"./[email protected]",__imageData:a(90920)})},o=e=>{let{alt:t,className:n}=e;return r.createElement(c.S,{alt:t,className:n,style:{maxWidth:"1283px"},imgStyle:{objectFit:"contain"},src:"./[email protected]",__imageData:a(88843)})},d=e=>{let{alt:t,className:n}=e;return r.createElement(c.S,{alt:t,className:n,style:{maxWidth:"1239px"},imgStyle:{objectFit:"contain"},src:"./[email protected]",__imageData:a(74875)})},u=e=>{let{alt:t,className:n}=e;return r.createElement(c.S,{alt:t,className:n,style:{maxWidth:"747px"},imgStyle:{objectFit:"contain"},src:"./[email protected]",__imageData:a(49776)})},h=e=>{let{alt:t,className:n}=e;return r.createElement(c.S,{alt:t,className:n,style:{maxWidth:"749px"},imgStyle:{objectFit:"contain"},src:"./[email protected]",__imageData:a(90763)})};function p(e){const t=Object.assign({p:"p",strong:"strong",a:"a",ul:"ul",li:"li",h2:"h2",span:"span",h3:"h3",pre:"pre",code:"code"},(0,n.R)(),e.components),{AlertWarning:a}=t;return a||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("AlertWarning",!0),r.createElement(r.Fragment,null,r.createElement(t.p,null,"This tutorial shows you how to integrate TexturePacker in your Xcode build within less than 5 minutes.\nThe advantage is that TexturePacker now updates the sprite sheets during compile time! No manual work needed!\nThe internal update mechanism in TexturePacker is very smart - it detects changes and only\nupdates sheets that are really changed - saving you time!"),"\n",r.createElement(t.p,null,"The screenshots in this tutorial are from an older version of Xcode, but the\nfunctionality is still the same - tested with Xcode 12. A small restriction\nis that the ",r.createElement(t.strong,null,"clean")," functionality does not work with the ",r.createElement(t.a,{href:"#new-build-system"},"new build system")),"\n",r.createElement(t.p,null,"Advantages for you:"),"\n",r.createElement(t.ul,null,"\n",r.createElement(t.li,null,"Sprite sheets are up-to-date all the time"),"\n",r.createElement(t.li,null,"Save memory on subversion/git by ",r.createElement(t.strong,null,"not")," checking in the sprite sheets"),"\n"),"\n",r.createElement(t.h2,{id:"saving-memory-on-your-version-management-server",style:{position:"relative"}}
1,"Saving memory on your version management server",r.createElement(t.a,{href:"#saving-memory-on-your-version-management-server","aria-label":"saving memory on your version management server permalink",className:"anchor after"},r.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",r.createElement(t.p,null,"You don't need to check in the complete sprite sheets in your version management system anymore.\nAssuming you have a bigger project, you end up easily with several megabytes of sprite sheets.\nWhy check them in if they can be built on the fly? There is no need for that.\nSimply check in your source sprites and let TexturePacker do the work during the build phase."),"\n",r.createElement(t.p,null,"This is even more useful for git users since git stores the complete repository on your local computer."),"\n",r.createElement(t.h2,{id:"project-structure",style:{position:"relative"}},"Project structure",r.createElement(t.a,{href:"#project-structure","aria-label":"project structure permalink",className:"anchor after"},r.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",r.createElement(t.p,null,"For this tutorial I assume that you have a similar layout of your project like I have here:"),"\n",r.createElement(s,{alt:"Project structure in Xcode for a SpriteKit game."}),"\n",r.createElement(t.p,null,"Your source sprites are all in an Assets folder, grouped into different directories to reflect the sprite sheets.\nIf you have a different layout - you might need to modify the scripts a bit."),"\n",r.createElement(t.h2,{id:"two-ways-to-accomplish-the-goal",style:{position:"relative"}},"Two ways to accomplish the goal",r.createElement(t.a,{href:"#two-ways-to-accomplish-the-goal","aria-label":"two ways to accomplish the goal permalink",className:"anchor after"},r.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",r.createElement(t.p,null,"There are two ways you can integrate TexturePacker into Xcode."),"\n",r.createElement(t.h3,{id:"the-easy-way",style:{position:"relative"}},"The easy way",r.createElement(t.a,{href:"#the-easy-way","aria-label":"the easy way permalink",className:"anchor after"},r.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",r.createElement(t.p,null,"The easy way is to create ",r.createElement(t.strong,null,".tps")," files from TexturePacker and update them from the build phase.\nThe advantage is that you can open the ",r.createElement(t.strong,null,".tps"),"\nfiles in the graphical user interface and change them. No need to do hard work on the command line."),"\n",r.createElement(t.p,null,"If so please save the ",r.createElement(t.strong,null,".tps")," files in your Assets folder, so the script can find them:\nIf you want to go this way use this script for the next phase:"),"\n",r.createElement(t.pre,null,r.createElement(t.code,{className:"language-bash"},'#! /bin/sh\nTP=/usr/local/bin/TexturePacker\nif [ "${ACTION}" = "clean" ]\nthen\n # remove sheets - please add a matching expression here\n rm ../Resources/sheet*.png\n rm ../Resources/sheet*.plist\nelse\n # create all assets from tps files\n ${TP} *.tps\nfi\nexit 0\n')),"\n",r.createElement(t.p,null,"You need to adjust the rm part to match your sheet's names during the clean phase."),"\n",r.createElement(t.p,null,"From my point of view the most important feature of TexturePacker is the SmartFolders feature.\nIt simply adds all sprites it finds in a directory structure\nto your sprite sheet. This allows you to do fast updates by simply throwing the new sprites into the\nfolder without the need of adding single sprites."),"\n",r.createElement(t.p,null,"If you create your sprite sheet use ",r.createElement(t.strong,null,"Add Folder"),' button in the toolbar,\nor simply drag the folder onto the right "Sprites" panel.'),"\n",r.createElement(t.p,null,"TexturePacker also allows you to organize your sprites into sub-folders.\nThis is very helpful to keep sprites grouped - e.g. by making a separate directory for each enemy."),"\n",r.createElement(t.h3,{id:"the-way-of-the-power-user",style:{position:"relative"}}
1,"The way of the power-user",r.createElement(t.a,{href:"#the-way-of-the-power-user","aria-label":"the way of the power user permalink",className:"anchor after"},r.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",r.createElement(t.p,null,"Instead of creating ",r.createElement(t.strong,null,".tps")," files you can simply use the command line interface of TexturePacker:"),"\n",r.createElement(t.pre,null,r.createElement(t.code,{className:"language-bash"},'#! /bin/sh\nTP=/usr/local/bin/TexturePacker\nif [ "${ACTION}" = "clean" ]\nthen\n # remove all files\n rm ../Resources/sheet*.png\n rm ../Resources/sheet*.plist\nelse\n # create hd & sd assets\n ${TP} --smart-update sheet1 \\\n --auto-sd \\\n --format cocos2d \\\n --data ../Resources/sheet-hd.plist \\\n --sheet ../Resources/sheet-hd.png\n\n # create ipad assets from same sprites\n ${TP} --smart-update --scale 1.066 sheet1 \\\n --format cocos2d \\\n --data ../Resources/sheet-ipad.plist \\\n --sheet ../Resources/sheet-ipad.png\n\n ... add more sheets ....\nfi\nexit 0\n')),"\n",r.createElement(t.p,null,"This example here creates hd and sd plist files and additionally resources for iPad\n(Remark: this is not the best option for iPad since this uses up-scaling.\nIt would be better to scale things down....)."),"\n",r.createElement(t.h2,{id:"integration-into-xcode",style:{position:"relative"}},"Integration into Xcode",r.createElement(t.a,{href:"#integration-into-xcode","aria-label":"integration into xcode permalink",className:"anchor after"},r.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",r.createElement(t.p,null,"This is now the main integration into Xcode. First thing is to save the script from the previous chapter\nas ",r.createElement(t.code,null,"Scripts/build-sheets.sh")),"\n",r.createElement(t.p,null,'The usual way to continue with the integration would be to add a "Run script" build phase - but this would\nrequire adding all the sprites as\ndependencies which has no practical use. We create a new target instead and let TexturePacker decide what\nneeds to be updated:'),"\n",r.createElement(d,{alt:"Add a new target to the Xcode project"}),"\n",r.createElement(t.p,null,"Choose ",r.createElement(t.strong,null,"Other")," / ",r.createElement(t.strong,null,"External Build System"),":"),"\n",r.createElement(u,{alt:"Choose External Build System as target type"}),"\n",r.createElement(t.p,null,'Choose a name for the target e.g. "SpriteSheet" and use ',r.createElement(t.strong,null,"/bin/bash")," as build tool:"),"\n",r.createElement(h,{alt:"Choose the settings for the External Build System target"}),"\n",r.createElement(t.p,null,"Next edit the target:"),"\n",r.createElement(t.ul,null,"\n",r.createElement(t.li,null,"BuildTool: ",r.createElement(t.code,null,"/bin/bash")),"\n",r.createElement(t.li,null,"Arguments: ",r.createElement(t.code,null,"../Scripts/TP-update.sh")),"\n",r.createElement(t.li,null,"Directory: ",r.createElement(t.code,null,"${SRCROOT}/TexturePackerIntegrationTest/Assets")," (adjust this to your project's name and path)"),"\n"),"\n",r.createElement(a,null,r.createElement(t.p,null,"The reason for an error like ",r.createElement(t.code,null,"unable to spawn process '/bin/bash' (No such file or directory)")," during\nthe build is most likely that the path in ",r.createElement(t.strong,null,"Directory")," is not set correctly.\nE.g. if the SRCROOT is set to a higher level directory or your project directory is in a sub-folder.\nYou can also use the ",r.createElement(t.strong,null,"Folder")," button at the end of the ",r.createElement(t.strong,null,"Directory")," line edit to select the assets folder directly.")),"\n",r.createElement(o,{alt:"Set the target parameters to run the sprite sheet builder script"}),"\n",r.createElement(t.p,null,"Now we have a target that we can build. To make things automated we need to set dependencies from\nthe main project to the sheet target:"),"\n",r.createElement(t.p,null,"Click the ",r.createElement(t.strong,null,"+")," button in the ",r.createElement(t.strong,null,"Build Phases")," tab of the main target:"),"\n",r.createElement(l,{alt:"Set dependencies from the main project..."}),"\n",r.createElement(t.p,null,"And select the ",r.createElement(t.strong,null,"SpriteSheets")," target:"),"\n",r.createElement(i,{alt:"...to the sprite sheet target."}),"\n",r.createElement(t.p,null,"That's all."),"\n",r.createElement(t.h2,{id:"new-build-system",style:{position:"relative"}}
1,'How can I use TexturePacker with the "new build system"?',r.createElement(t.a,{href:"#new-build-system","aria-label":"new build system permalink",className:"anchor after"},r.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",r.createElement(t.p,null,'The "new build system" â which is now the default in Xcode â\nmakes several changes. The most important one is that the build system does no\nlonger support the ',r.createElement(t.strong,null,"clean")," action."),"\n",r.createElement(t.p,null,"The scripts above are still working with this except that the clean\nphase is no longer working. You have to manually delete the generated\nsprite sheets."))}var m=function(e){void 0===e&&(e={});const{wrapper:t}=Object.assign({},(0,n.R)(),e.components);return t?r.createElement(t,e,r.createElement(p,e)):p(e)};var f=a(11042),g=a(77891),b=a(74110);function w(e){let{data:t,pageContext:a,children:n}=e;const c=a.pageData,s=t.mdx,i=s.tableOfContents,l=s.frontmatter.noTitleImage?null:s.frontmatter.image;return r.createElement(g.W,null,r.createElement(b.n,{pageData:c,image:l,onPageItems:i.items},n))}function y(e){return r.createElement(w,e,r.createElement(m,e))}const x=e=>{let{pageContext:t}=e;return r.createElement(r.Fragment,null,r.createElement(f.A,{pageData:t.pageData}))}},74875:function(e){e.exports=JSON.parse('{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/10d8c259b213c879773ff7c5ca16db4f/bc6cb/Xcode-Tutorial-AddTarget%402x.png","srcSet":"/static/10d8c259b213c879773ff7c5ca16db4f/e7fb6/Xcode-Tutorial-AddTarget%402x.png 620w,\\n/static/10d8c259b213c879773ff7c5ca16db4f/50538/Xcode-Tutorial-AddTarget%402x.png 1239w,\\n/static/10d8c259b213c879773ff7c5ca16db4f/bc6cb/Xcode-Tutorial-AddTarget%402x.png 2478w","sizes":"(min-width: 2478px) 2478px, 100vw"},"sources":[{"srcSet":"/static/10d8c259b213c879773ff7c5ca16db4f/4238c/Xcode-Tutorial-AddTarget%402x.webp 620w,\\n/static/10d8c259b213c879773ff7c5ca16db4f/aec4f/Xcode-Tutorial-AddTarget%402x.webp 1239w,\\n/static/10d8c259b213c879773ff7c5ca16db4f/6eba5/Xcode-Tutorial-AddTarget%402x.webp 2478w","type":"image/webp","sizes":"(min-width: 2478px) 2478px, 100vw"}]},"width":2478,"height":1788}')},88843:function(e){e.exports=JSON.parse('{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/2d45b2b8a7f34eda65f862f8bd49bae5/0c8b0/Xcode-Tutorial-ScriptSettings%402x.png","srcSet":"/static/2d45b2b8a7f34eda65f862f8bd49bae5/dbc02/Xcode-Tutorial-ScriptSettings%402x.png 642w,\\n/static/2d45b2b8a7f34eda65f862f8bd49bae5/316fe/Xcode-Tutorial-ScriptSettings%402x.png 1283w,\\n/static/2d45b2b8a7f34eda65f862f8bd49bae5/0c8b0/Xcode-Tutorial-ScriptSettings%402x.png 2566w","sizes":"(min-width: 2566px) 2566px, 100vw"},"sources":[{"srcSet":"/static/2d45b2b8a7f34eda65f862f8bd49bae5/7633c/Xcode-Tutorial-ScriptSettings%402x.webp 642w,\\n/static/2d45b2b8a7f34eda65f862f8bd49bae5/fba25/Xcode-Tutorial-ScriptSettings%402x.webp 1283w,\\n/static/2d45b2b8a7f34eda65f862f8bd49bae5/ab7e2/Xcode-Tutorial-ScriptSettings%402x.webp 2566w","type":"image/webp","sizes":"(min-width: 2566px) 2566px, 100vw"}]},"width":2566,"height":738}')},90763:function(e){e.exports=JSON.parse('{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/4c1eb3f5912ab3da23dd6315f5b72065/3696c/Xcode-Tutorial-TargetSettings%402x.png","srcSet":"/static/4c1eb3f5912ab3da23dd6315f5b72065/264ea/Xcode-Tutorial-TargetSettings%402x.png 375w,\\n/static/4c1eb3f5912ab3da23dd6315f5b72065/ae15e/Xcode-Tutorial-TargetSettings%402x.png 749w,\\n/static/4c1eb3f5912ab3da23dd6315f5b72065/3696c/Xcode-Tutorial-TargetSettings%402x.png 1498w","sizes":"(min-width: 1498px) 1498px, 100vw"},"sources":[{"srcSet":"/static/4c1eb3f5912ab3da23dd6315f5b72065/2956b/Xcode-Tutorial-TargetSettings%402x.webp 375w,\\n/static/4c1eb3f5912ab3da23dd6315f5b72065/989f4/Xcode
1-Tutorial-TargetSettings%402x.webp 749w,\\n/static/4c1eb3f5912ab3da23dd6315f5b72065/1c5f9/Xcode-Tutorial-TargetSettings%402x.webp 1498w","type":"image/webp","sizes":"(min-width: 1498px) 1498px, 100vw"}]},"width":1498,"height":1070}')},90920:function(e){e.exports=JSON.parse('{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/076ea6959576cee59fa6539279a9ea6e/2a7a7/Xcode-Tutorial-Dependencies-1%402x.png","srcSet":"/static/076ea6959576cee59fa6539279a9ea6e/edb28/Xcode-Tutorial-Dependencies-1%402x.png 642w,\\n/static/076ea6959576cee59fa6539279a9ea6e/67101/Xcode-Tutorial-Dependencies-1%402x.png 1283w,\\n/static/076ea6959576cee59fa6539279a9ea6e/2a7a7/Xcode-Tutorial-Dependencies-1%402x.png 2566w","sizes":"(min-width: 2566px) 2566px, 100vw"},"sources":[{"srcSet":"/static/076ea6959576cee59fa6539279a9ea6e/967de/Xcode-Tutorial-Dependencies-1%402x.webp 642w,\\n/static/076ea6959576cee59fa6539279a9ea6e/11740/Xcode-Tutorial-Dependencies-1%402x.webp 1283w,\\n/static/076ea6959576cee59fa6539279a9ea6e/3506b/Xcode-Tutorial-Dependencies-1%402x.webp 2566w","type":"image/webp","sizes":"(min-width: 2566px) 2566px, 100vw"}]},"width":2566,"height":768}')}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.