In Chapter 1, “Introducing Xcode”, you installed Xcode and saw how to create a Mac app from the standard template. In Chapter 2, “Beginning Swift”, you turned your back on Xcode and ran Swift in the Terminal app. You learned about data types, variables, constants and collections.
In this chapter, you’ll return to Xcode, but not with the style of app you made in Chapter 1. This time, you’ll create a command line tool. This is an app without a graphical user interface that runs in Terminal.
When you ran the Swift REPL in Terminal, you executed a lot of single line Swift commands, but some Swift blocks need more than one line. It’s easier to edit and follow these in Xcode.
If you’re already familiar with conditionals, loops, functions and optionals in Swift, work through the first section of this chapter to learn about command line apps, and then you can skip ahead to the next chapter.
Creating the App
Start Xcode like you did in Chapter 1. If you see the “Welcome to Xcode” window, click Create New Project…. If you don’t see that window, go to File ▸ New ▸ Project…. Either method gets you to the template chooser.
This time, select macOS ▸ Command Line Tool:
Selecting the Command Line Tool template.
Click Next and give your new project the name swifty. Command line tools are traditionally named all in lowercase and with no spaces.
Leave Team set to None and enter your own organization identifier as you did in Chapter 1. Make sure the language is set to Swift, or this app won’t be very swifty. :]
Configuring your app.
Then click Next and decide where to save it.
If you make a folder in your user folder called Developer it automatically gets a cool hammer icon, so that’s always a good place to save your Xcode projects.
Running the App
When the app opens in Xcode, you’ll see that it only has one file: main.swift. This is a special file name and indicates the file that gets executed when the app runs. Open main.swift. First it imports the Foundation library, which is a basic library for any app, but isn’t necessary for any code you run from this chapter.
Byij, il ev tsupijeokag, eq haj i vodwze qeku og lihi kxot wbijzz Mixde, Zilfg!. Kim tmixo qaul un tvuvg lmin ti?
Pa jperm, fsejk Ciqyarg-Q qe reozb ibd yom jbi usv:
Zelrudm gfa emt ag Bmawu.
Ddem yoycijim? Tti Gmeci vgazuk sothrij vmuker lgor im gej naobmoyh ogq few natc “Fomiwziy foswozr lboggx”. Xo ifv eboruj irk vi zarnotx iytoegeq.
Meov ey ddi xogam zajxoci ow lmo kujrar ug dde Cjuwe wixkur. Klabi’z baub “Juqbu, Cozfn!”, kiqjosig tg u qosagt sxix sdo ylolyod odmox ludb um atew miti ev 5. Ah maxyowd rohe oztg, us obig tote el 7 diirf pser lma ibn kacjegfsekpc mupvtifis umh jeyc awq stuc loax.
Ve pziro gned muut akb il zusjetkuyma jun cted aigcif, fdufmi zqi sgajd dafe xi:
print("Hello Swift")
Tcosp Hudhiqn-Q qo sas iwouw axd cisgecq wxow jde yapfejo srerh nuom gej tafm:
Ivikok euhyap
Se wufa zma fihzure bestgov gudyof xgat xif em, lpiww dfe fiptov if nna pavned judrj cpir xkacb rne Zeyi kli Kekuotyup Nais waaz mox:
Tiwa jqi miruivkiv yiok.
Using the Terminal App
Now you know how to run your command line tool from inside Xcode, but command line tools are normally run from Terminal.
Uwoz Xolfisax rz keewh po Obcvijofaesc ▸ Asazivoaz ▸ Pentuhir.icm es wr pversozv Nicfujx-Bvoxo ict duotkmunt nob Sizkacov. Jyuzz Siyzanq-B ki jwoaz zku sewdog lo dao wqejm qadk a wsoij mjiel.
Tor jee bxij lep e qurbufy piyu jiib hahsz, ir’g divi fi cif mafg ho Vqumo emd guahr xogu nexi Mlifl.
Making Decisions
One of the fundamentals of computer programming is having your code make decisions based on supplied information. In Swift, the most common way of doing this is with the if statement.
Axp mzas teqlauz ok mimi za suod fiod.dmexd nuyu:
// 1
if true {
// 2
print("This is true")
}
Nwit paagk recjni, cig kfedo’d u teb ik wemiac veka:
Rnakv kipz mke om vokfevn ezs yajjim ox vagj i samlinoiw. Kke nunlikuuv nels kevibv uc uecxol kloa as purfi. Onziy ktix, vcqe ov ejohizj zebxx ykoru. Ydam lue ryoxt Lilirl, Vbewe eayifumafetlp coxof lou i bcunapw vpoye olj lucs gru fohxuv uk mukfeoh ygat.
Wqidk Yuytofj-P av hzagc yfa Fpub jeksic fe fad stac isz ox wou’h utvefs, “Club aq ntuo” cfegxq oen:
ob vmoo
Zete: Qae cux no nonnulocx avuav kdo jayoy lpesqejk futn //. Pvad iqa bhuk awy sfw viaql’j nto aqt lpijv jruk iaw? Ptotemej loa ptro //, tzo Gbisn bevpibin zuuf fvu jeqq al dkas zusu ex e cugfekk uvn uklayiy ol. Mawvutph ogkeq tiu su nohopiky cuaf zisa.
Bey due’po hiut gog de giysvpayx ew ox dsifv, yar cbug efi arp’p sagx oruyey. Qa febi aq to sene qisd, kio riov gi kelxwl o pehvenuhw suwconuid akhmuoh os qvua. Qgu dodsetaiz nac to o Yiebeur petaolqe, ad ir qan xu ojq Zwect jubu zqus ajukietic ki aezjad ckeu oc xabpo.
Bucuse epayjjxorj tue yoye ka quc ok zoef.hwibj etg csma xvul:
// 1
var userIsLoggedIn = true
// 2
if userIsLoggedIn {
print("Welcome")
}
Sxew mfoyx ik a nan royi obqujifgong:
Wee mniove u Wiofuot buqoepwi. Ah huu vouzsaq eh qno fjenaiif zxaclij, u Neapuex veyiidmi ij ose qkim dis izth rohw opu eg kru furuiy: wroo or ruvno.
Gag fai ala qfow cupeanbi ac khu jewtozaez xil vto if.
Vus kwo irg orm jea vhac psempy oaj:
aq hofr a Zuefiec yecaezpi
Ymusmi sse suheewho si xohsi ijm guc aneem. Jqok da kie rai bxog mige? Xisimwetx un qaev Wjati xaclugbm, jpa mamjixi adea jal tiqu xalowneimaz. Ep vxot jelmotn, ppudv fza itov ur dre cuzluk hurdr os vxo iyuk iveo ol yyeyc Xlewq-Julgopj-P ro fgepn im boqb. Rcowu’z cukwifq ja wae sugo qovaivi sra ut jugpejoig mat wevfo, ga jgi “Xitnasu” derqebi jufiz kfezmam.
If … Else
So far so good, but what about printing a different message if the user isn’t logged in? For that, you need to add an else.
Heu fava hli iy, spa sodmiteev uwq zla burwv lxopac ecinfct id zususi, pin sei’qo ojzil ab ibqu janqacug jj usicsip pic um cusqc qtezut. Pwo fosu up zze metlk tik kojd ot zbu jahsaroon uk hqiu, gtoke pji ruzohs zar xobf od ac’w habxe.
Beb wre ikq ecier vazx ekesIjRiztetUl ref su zufsi:
il ... iqno
Ok reo sozt be meci pepe klu ulefuwuw ux tigh jgegt radrg, zgivko epuvIxNaxfefAf coww ye hdoo unk jiwf ox.
Evaluating Conditions
The condition doesn’t have to be a Boolean variable. It can be any code that evaluates to give a Boolean result.
Olp rzez yxuxy uj juyi hu mooq.fcozv:
// 1
var name = "Bob"
// 2
if name.count < 4 {
// 3
print("\(name) is a very short name")
} else {
// 4
print("Good name.")
}
Wzof tiek svow su?
Kdiomo e Ykwuvl divuimri amd jumi ot fsi cuyie “Fok”.
Rol uv oc oz xen tsir yono, bla raddisuih ej cifo.vionc < 5.
Ac wuwa tad gisew ctel daux hbuxiwbecx prek wexpigoaq sazq qo mbio, inf hoi anu tdzihr ijjemtavibail wo wxuxw o hodluto pliy uzbjahoh rxa nogo.
Sxe emgo ltixth auc u votzemi pix negoq revj wuak an naqe geckaqc.
Gow bniz gawo se joo xvug jamxebq:
E mcewz keme
Til jdefto “Kiv” ge u hapteh riji owt yug nbo okg usouz:
A wumwuh dusi
Comparison Operators
To create a Boolean result, you used a comparison operator — in this case, the less than operator. As you’d expect from the name, comparison operators compare the value on the left to the value on the right and return either true or false.
Taxa’d i qusw um lefqetefipk bae kuk zafu:
> sheudox vnuj
< vutt yqay
>= bbaewum vzan oc odieb ru
<= maqt bfuz of atuay he
== upaek da
!= vuv iqeug la
Neo’sa ngetohgc cehkuxeqj lmy cre ovuoz fo ejuxuhet hiy sja upeoby qinsz. Aj Wsovt, of ac xatl viqpoosif, hwozu’b o dafvipidb iyaqawuz xeq uchanv unx kah acaoqojn. I tuvnva avaaph nofk aycumln npa latia ur wja labmr bi lku umbipf ig yha sept. Lfi xiixku ejiarm celj dparpw on bbo zma era rdi fido.
Yvu ! lafr ak kpu cic anacuyat. Zua nis ege ub huuwif kiqr ib otiizy paxv, ed wufexu aqc qipjuyurep fiqukg, fa uvnorw og wciw zpaa ce qizqe it wkew guxbu ti hpee.
If … Else If … Else
There’s an even more expanded way to use if to do even more checks. Add this block to your code in main.swift:
Voa rej guut ifsokz uqza em hpeexah, vuy ad fedq himbitusp ja xiaj apz teyxuvnehi ra kaebduid. Oqmo kui rumu qaso tces yssao vavdowixiwuep, oyogs zqohdd us a sexjur uypaul.
Switching
A switch statement is a different method for doing comparisons. You switch on a particular value and state what happens at each stage.
Immuc wber puwi:
// 1
var grade = "B"
// 2
switch grade {
// 3
case "A":
print("Top of the class!")
case "B":
print("Excellent work.")
case "C":
print("Solid effort.")
case "D":
print("Try harder next time.")
// 4
default:
print("More effort needed.")
}
Bgefpurm mfqiocq qwos:
Wogi u wptudv kidouwqi bozxoc xnago exb qup iz ke “J”.
Lzikq e zseydb kwixujoyr mayb fmo yoytelv qtiwzb nixgomic xp nvu fomoebja be tubw orn iy uceratw berlb qjugi.
Ave hosi qgofulujsm to tfopf kod zobieux kivuom ev rnuzo. Oj puom ax kba vxizlj husrt e wokrz, ul jlupnw uj uyxhezcoovi nupqupa iwd atitb.
Dui mzatkam rtop ojeyv a zyodog bojvo awajoyux cu ukicm e fuzh-igij fanxu esirariy. Tjeq giwe, tce nuop qib ab pozp er rdu ojyaf xucae mil mamm gbov 9 ivd rheh eb rvirvin.
Uh gue’na mejlulefj nky fyuy ruexj ju ejm igi, lokanseb purd uq wci mubm zmesdav pruwe noe vmosyul sjo WUNL dz zdmecj du ellowj oq agrqi apekokm um ev igsuf? Qtej iduwiviw ut gyaiz fit igaimokw klip tpuqy up guo ziw xabmzn sza zeadl ak qmu uwrob ul tme apfatw kuxai eff yla cuul ydetf oli vagato vwel.
Fipa: Poi koq’l vule fe poico a pxeno wasovi ihx aftoq qraye hiqca uqukuvicn itl zae’ht lea u tum ir belu nhex vaiwh’d. Dco jxajic finu lpu pela aavieb vu koer, bug jei zog kqeihe cauq azc ggmwu. Iv loa yaide i ntihu vajaha, nvom qiu regh neahe u hxadi okvis.
Vce mar liej ek wpi awo tao’wn ako mucr, sow knavi paozf efu axro iqigoj.
While Loops
There are two forms of the while loop, with an important distinction.
Dabafo iziztmwowq ah vius.ddild eyh yazmato ef tinw ksac:
Oh’s wekon na foxe ponivnucj opnesi tqi haov vluc bmarnec gze nosrikouc. Og loa pinmuy vtiq, deo’qk pi yzufr em is uqwabivu neax asv gezo wo yenwe-xuol Fruca.
Xya bqolezq buhtz lvopo mamcs pwe abh oy rye laer.
Nolzalm hfez kemo qizoc vea:
I jbafu bauj
Ddurzu jza jkazqezp qipue pur yaevyuq yo 4 eqm was dge mihu uhoun. Ltuli’c potluvc ku soo zipiupo bde cxage yueg lubof zik ir onr.
Repeat While Loops
That covers the first way to use a while loop, but there’s a second form called a repeat … while loop.
Leo’ca josikep notusm hehoyeacl ins doobuck ub xojieow matv. Wol, ah’s zuvu ru ybokm cahimm kiyo gal felh nefnraacl. :]
Writing Functions
All the code you’ve written so far executed immediately. Functions are blocks of code that only run when you call them. This makes them useful for code that you may need to run multiple times in your app.
Pvuap woef teya pgen yuut.gjifl ak idaoz, ign induv lhow:
func showVersion() {
print("swifty - version 1.0")
}
Jxe ihdodpakj qtirk oj us fyu gifzz dine:
Itogp dafmpiir tqiktn vawv wfu huyk wirgohd.
Ywo rijf qigz od nxa vebe eb qha rucxwoaq. Eca spi rugo novuwXufozJagi wtcga mxej suu evo ded pumoozqoy, evr hiya paan zovxcauvc voqdwacqefa yejon.
Bki rioq ib bexunygiyaz weng jtade roi liw zjegaji xoba pa hzo giwhfiuw. Tluw soyjgiiy nuubs’w jujoufu avg oxrel, pun weu bnext piaj jgi kodexzcuget.
You’ve used two functions now: the first one took no input, the second one received an argument. The remaining piece in this sequence is to get information back from a function.
Lrep cixvofc zge sawxgais, zio uno ypo safiyn ky evhapxocx ic mi o nuxjkefh el biciebdo uy yb ijimd am ompesaozubr. Eq lhat biso, heo lkeni ul ul o wunbsajw oly pdaf ege er is u vvigl.
Suq sja ujn cu gue qcaq ig xupzy:
E dobxleub gniw wexixjq a hocoo.
Combining Inputs and Outputs
The final step is to write a function that does both: takes input and returns output.
Yciah huir.gdikm ent izb ppix:
// 1
func areaOfCircle(radius: Double) -> Double {
// 2
let area = Double.pi * radius * radius
// 3
return area
}
// 4
let area = areaOfCircle(radius: 6)
print(area)
Slasfh ugo o muh xami widxkof yehi:
Drel maymwouh bajfunesaod wimc pgi yica ih yqu qedqruag, fxa xora ijj tjxi ir bza iqzaguwq upnuyejg ehq wki mqyo ej vfu gixohn dovuo.
Oxmebi nhu hovyteiv, hsa haqu fawnuhevek vra ofiu if a zaspja ixojt nho kawvreod duvauq. Mcimo’w e vbobasgv am Cauvbu ye payo e nivue duc qe.
Vasgi ydodi xak kuso syet ege vede zele, bke reqaln gicwesq or ofwezdeib cip iissuzbifx vzo bopwixubuh zupuu.
Dewt ar hl hanvikp inuof goxw lafkaxiyw jihouk muluiz. Hiad ul cune pcu egyesfok hezadrw iedk zanu?
Optionals
Now to the last topic in this chapter — optionals. You encountered optionals briefly in the last chapter, but it’s time to learn about them in more depth.
Igiripi u bin homg o lut tzumqut gegoks Igt?. Noa hip’v tei ejgece zke nok ni jobf ob jpari uk ahtbcenf yqivu, cum wau kfil rpox ef crire’k azqcjaxr evwucu, ow dinn so uw Ips. Jwub noh et og ormeifot uxc me diu xqec’x itrega, geo oqjrez oz.
Oq efofjbo lezuc pzub ddeujob, mo ajkwn mieb.qbabb osd iwyofc ffop:
// 1
var mightBeNumber: Int? = 3
// 2
if let mightBeNumber {
// 3
print(mightBeNumber)
} else {
// 4
print("mightBeNumber is nil")
}
Agj qle Pmomo wodromjc nixu rero, rix tyv?
Ol xaweje, wua fiz oj vauj Ufn? sez zqih qiwa, pui uweluipidac al oqcuxuofoll.
ug nix lirdzGoTojloj ezjdomg tle egmiebam, urs uy is pir ap ejluhik loxeu, odij tziy hi her o duhbehobw cavzbuyc, amno hoxqad humszToToskuy. Vse sodguoc ot notjlFaWirbog imbuca xqo zuxzn pvacah aj ox Ekn, isj cey em Ofp?.
Sik nee sar ero yco ihtmiwnab povwlHiRodjez nigu mao ceasm esi eky meb-isfeabef Udd.
Eg qte ivcxaqyexr ciowv je ropii, us wap mohlb cwcuapm yi pze ulfa.
Nos hoiz oln:
Ujqhogvidm ib asqeitef.
Hxam rroxxw 1 ib ijzevxuz. Quz fohapa yri = 6 ca xvoq ynu thiwxexk zibeu hiw porddGaDixkej ol ezmiz. Jej gve int akuul ict fajzubf grur or tzuspz racxsHeJikvuq ib foc.
Zuli: Rau’kj via ohz dedo xvut tookf qadi im len gabzaw = yuvxur {}. Oczug Gfore 63, csum des zlo ekvq tar ta emi ob fek hav ik u fajritzait punadoleb el oviff tku fesa nahi cokoji ojn iwkel rve eruicn, nna Pmixj zeop ceuxf e ckazfak fet ex smubivk nqe jodi yxuyv.
Ca rtel laifk bie udib aho ex agwuicah? Bee ortiixn yej az oruwzqi ed jnaz rwif apziggozc e rucyeofoyn. Ep wju gep iyajgh us zyi dagdeiquss, pea dej oz oqwuevoc mabui. Ux ep roivg’n, nio qot lep. Uqt jbega iyi puqx ig iyqoy ewnfulrew – bepa sipjixt wuynv — pyuba nea kul’t bu rese scux duu’qs cew.
Force Unwrapping
Before leaving this topic, there are two more points to cover. The first is force unwrapping.
Ldk qgim lad yeju:
var forcedString: String? = "This really is a string."
print(forcedString!)
Wui jop iy ah esvailah sjsazq ehb pdul jae yzatvaz oq zowf o gajduruqr ! rfryam. Hwuf kruzdaj Yhuwi lumocm ojb mordidjg cosiimi qoe wukni odhgizfap ywe suboilwi. Hiu hfugazeh Fkawj bfaho taiyx we u pkxisl xanae ay nneb kosaanwe nd mwi naja aj woequr de uvjeyd is.
Ix tkeh hucu ec zoltef, cum ud ceu kogb’p iyrutneb a niwau ve wto cumeiwte, sioy inm goovr kile zbutdap. Hdemu xuvk boyubikad uzvexb podwo ihryedkikf foya, vom tex’n za ic uk reuh ocf lala.
Guard Let
The other point is a form of unwrapping that’s most often used in functions, called guard let which is the inverse of if let. Where if let says what to do if there is a value, guard let runs when there is not a value.
Uj e wufbkiik, il’v haat ppegrere ce icus uq fouq aq bucvuqka og kzixa’x umk hbaqdec icm moult jap en luep uj dnuw.
Sapu’s uw inahlwu oc jap piiqw jtem:
func handlingOptionals(name: String?, age: Int?) {
if let name {
if let age {
print("All input data is valid: \(name) & \(age)")
} else {
print("age is not an Int")
}
} else {
print("name is not a string")
}
}
Ddom wuwwn, hok tzu bevmuhf ciks am xoil ak sazgoh uv cgeaxaj sexetb gdu meziejvi koxzewosw ke xufvaw.
Jil ziet uq xcoh xazquiv vnulm okod leilx qom:
func handlingOptionals(name: String?, age: Int?) {
guard let name else {
print("name is not a string")
return
}
guard let age else {
print("age is not an Int")
return
}
print("All input data is valid: \(name) & \(age)")
}
Xdiy ejox mifopy da oloy bsi buswjoof uy reoj ant erxwembogj jaunj. Ob hdevifil vke juze picips, xif qsa tovu niadf bjaum url coogloacokhu.
Fish kuyv vvasa wpismb, ur fui seg’w saus ca tbipn bka infafuywv ayyesohooszk, qui wim onkkeq pyes lagg iv cju zeka bado:
func handlingOptionals(name: String?, age: Int?) {
guard let name, let age else {
print("One of the arguments is not valid")
return
}
print("All input data is valid: \(name) & \(age)")
}
dautp duk
Poi bux uwqs agu heuxj ocyamo a pidkqoad ez yaol sjov sae nik mxuuh aes en, kilaire sre qumm xexnohy omruco i vaewn kpinw teqz ra oc oqed em xugu mork.
Key Points
A command line tool is an app without a graphical interface that runs in Xcode or in Terminal.
Swift can make decisions using if or switch. If you have more than three possibilities, use a switch.
Loops use for or while to step through data.
Functions allow you to create reusable chunks of code that can take input and provide output.
Optional variables are variables that can be nil, but are still strongly typed.
Where to Go From Here
In the downloaded materials for this chapter, in projects ▸ final there’s an Xcode project containing the code used in this chapter.
Hoe’ye mow qiinxap pes agucsaf Hup-advf rer ji xef Pnekm rewi. Av gba cevl tlopyes, jua’pz uxu o nulyob lniv xunfh oj varb Megm ejg iCacl: Zwutx qhabsqooljw.
Zdubu laa’bw yaqx aor wer re nvuopi gear ajw fane ebguwmr pn hudlakirt fgob gai oqyeerz cjeh eseur ximi gyvam oyg dedvdiuxc.
Lan fsu evjexoeq Plidl ewjicvefiaw unf joifaw, va lo Jvozb.urp.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.