You are on page 1of 10

Chi Swift

Swi ft isa nuovo linguaggio di programmazione per le applicazioni iOS e OS X che Bui LDS sul
meglio della C
e Objective-C, wi sarie, senza vincoli di C compatibi li tà. Swi ft adotta sicuro
programmare modelli e aggiunge caratteristiche moderne per rendere la programmazione più
semplice, più
flessibile, e più divertente. Tabula rasa di Swi ft, sostenuto dal cacao maturo e molto amato
e quadri Cocoa Touch, è un ty opportuni per re-immaginare come lo sviluppo di software
funziona.
Swi ft è stato anni nel processo decisionale. Apple ha gettato le basi per Swi ft approfondendo le
exi pungere COMPI ler, debugger, e le infrastrutture quadro. Abbiamo SIMPL i ficato memoria
gestione wi th Automati conteggio c di riferimento (ARC). La nostra pila quadro, Bui l t su
la base sol id di Fondazione e Cocoa, è stato Moderni Zed e Standardi Zed
tutto. Objective-C i TSEL f è evoluto per sostenere i blocchi, col colta li teral s, e
moduli, ENABL ing adozione quadro della moderna tecnologie linguistiche wi Thout
di sruption. Grazie a thi s basi, possiamo ora introdurre un nuovo linguaggio per la
il futuro dello sviluppo del software Apple.
Swi ft sensazione s fami l iar agli sviluppatori Objective-C. Adotta il readabi l i tà di Objective-C di
parametri denominati e la potenza del modello a oggetti dinamicamente c di Objective-C. Esso
fornisce
accesso diretto ai exi pungere framework Cocoa e mix-and-match li interoperabi ty wi th
Codice Objective-C. Bui lding da thi s terreno comune, Swi ft introduce molte nuove caratteristiche
e FIE uni le porzioni procedurali e object-oriented del linguaggio.
Swi ft i s amichevole per i nuovi programmatori. E i s il primo -qual industriale i TY sistemi
linguaggio di programmazione che è espressivo e divertente come un linguaggio di scripting. esso
sostiene campi da gioco, una funzione innovativa che Al lows programmatori di sperimentare wi th
Codice ft Swi e vedere immediatamente le Resul ts, wi sarie, senza il sovraccarico di bui lding e
funzionante
un app.
Swi ft combina il meglio nel pensiero moderno linguaggio wi th wi Sdom da Apple più ampia
ingegneria cul tura. La ler COMPI è otti zed per le prestazioni, e la lingua è
otti zed per lo sviluppo, wi Thout compromi cantare EI ther. E 'progettato per scalare da
"Hel ecco, mondo" per un sistema operativo re Enti. Al l thi s fa Swi ft un futuro suono
investimenti per gli sviluppatori e per Apple.
Swi ft isa Fantasti c modo di WRI iOS te e applicazioni per OS X, e wi ll continuano ad evolversi
wi th nuovo
caratteristiche e capabi l cravatte i. Il nostro obiettivo s per Swi ft sono ambi zioso. Non possiamo
wai t per vedere cosa
si crea wi th i t.
A Swift Tour
Zione Tradi suggerisce che il primo programma in una nuova lingua deve stampare le parole "Hel
ecco,
mondo "sullo schermo. In Swi ft, thi s può essere fatto in un unico l ine:
println ("Hel l o, w orl d")
Se si dispone di wri tten codice in C o Objective-C, thi s sintassi è fami l iar a voi-in Swi ft,
thi s l ine di codice i s un programma completo. Non è necessario importare un l ibrary separato per
funzionale i ty l ike input / output o stringa handl ing. Codice wri tten nell'ambito globale i s usato
come
il punto di ingresso per il programma, in modo da non avete bisogno di una funzione main. Lei al
quindi non c'è bisogno di
write il punto e virgola alla fine di ogni istruzione.
Tour Thi s fornisce informazioni sufficienti per avviare codice WRI ting in Swi ft mostrando come

Non preoccupatevi i f non si capisce qualcosa-tutto introdotto in thi giro s è spiegato in detai l nel resto del thi s libro. l et i mpl i ci tInteger = 70 l et i mpl i ci tDoubl e = 70 0 l et expl i CI tDoubl e: double = 70 EXPERIMENT Creare una connessione wi costante th un expl i ci t tipo di Fl avena e una val ue di 4." l et frui tSummary = "Ho \ appl (es + arance) ECE pi di frui t. I valori non sono mai impl i CI temente convertito in un altro tipo. expl i CI temente fare un'istanza del tipo rosso desi. ma è necessario assegnare il valore ita esattamente una volta. var Shoppi NGLI st = ["catfi sh". Nell'esempio precedente. e accedere thei elementi r da WRI Ting l'indice o la chiave tra parentesi. "w ater". Thi s significa che è possibile utilizzare le costanti di nominare un valore che si determina una volta. Tuttavia. Per esempio: l et appl ES = 3 L et arance = 5 l et appl eSummary = "Ho \ (appl es) appl es. Il valore di una costante non fa bisogno di essere conosciuto al compi le tempo. separati da due punti. var myVari abl e = 42 myVari abl e = 50 l et myConstant = 42 Una costante o variabile devono avere lo stesso tipo del valore che si desidera assegnare a i t. Creazione di array e DI ctionaries utilizzando parentesi quadre ([]). Che errore si ottiene? C'è un modo ancora più semplice per includere valori in stringhe: write il valore tra parentesi. l et l abel = "L a w i DTH i s" l et w i DTH = 94 l et w i dthLabel = l abel + Stri ng (w i DTH) EXPERIMENT T ry removi ng la conversi a Stri ng dal l ast li ne. e write una barra rovesciata (\) prima delle parentesi. fy specifiche del tipo da WRI Ting dopo la variabile. "tul i ps". NOTE Per la migliore espe rienza. la ler COMPI ne deduce che myVari abl eis un intero perché i ts ini ziale valore isa intero. Fornire un valore quando si creare una costante o variabile consente al ler infer i ts tipo COMPI. Se avete bisogno di convertire un valore in una di tipo fferent. Pl aygrounds al l ow di EDI t il codice l i sti NGS e vedo il resul t i mmedi Atel y. Se il valore ini ziale non fornisce informazioni sufficienti (o se non vi è alcun valore ini ziale). ma utilizzare in molti posti.a accompl i Sh una varietà di compiti di programmazione. non sempre è necessario write tipo expl i CI temente." EXPERIMENT Usa \ () per i NCL ude un fl OATi ng-poi nt cal cul ati su ina stri ng e per i nome ina ncl ude di qualcuno greeti ng. semplici valori Utilizzare l et per effettuare una var costante e per effettuare una variabile. capitolo aperto thi s come pl ayground in Xcode. "bl ue pai nt"] Shoppi NGLI st [1] = "bottl e di Ater w" var Occupati ons = [ .

Otherwi se. l et emptyArray = Stri ng [] () l et emptyDi CTI coronarica = Di CTI coronarica <Stri ng. e do-w hi le per fare loop. Shoppi NGLI st = [] // andato ng shoppi e comprò everythi ng. . e utilizzare per-i n."Mal col m": "Captai n". 43. Le parentesi intorno alla variabile zione o il loop Condi sono opzionali. 12] var teamScore = 0 per punteggio i N i ndi vi dual punteggi { i punteggio f> 50 { teamScore + = 3 } Else { teamScore + = 1 } } mscore In un'istruzione if. controllo di flusso Utilizzare se e sw mi tch fare condi zionale s. 87. . 103. ch whi rende il valore scartare Avai lable all'interno del blocco di codice. Se il valore è facoltativo ni l. Un ther valore EI opzionale contiene un valore o contiene ni l per Cate indi che il valore di i s mi ssing. È possibile utilizzare se e l et insieme per lavorare valori th wi che potrebbero essere mi ssing. var opti onal Stri ng: String ng? = "Hel l o" opti onal Stri ng == ni l var opti Nome onale: Stri ng? = "John Appl eseed" var greeti ng = "Hel l o!" i f l et name = Nome opti onal { greeti ng = "Hel l o. la condi zionale è fal sé e il codice tra parentesi graffe viene saltata. w hi le. uso l'ini ziale i Zer sintassi. Che greeti ng cosa si ottiene? Aggiungi un else cl ausa che imposta una di fferent greeti ng se opti onal Nome i s ni l. } È un errore. per. non un impl i CI t figlio compari a zero. . \ (nome)" } EXPERIMENT Modifica opti Nome onale per l ni. l et i ndi vi dual spartiti = [75. Fl avena> () Se le informazioni sul tipo può dedurre. ] ons Occupati ["Jayne"] = "Publ i c Rel ati ons" Per creare un array o di ctionary vuoto. le condi zionale deve essere un valore booleano espressione-thi s significa che il codice come ad esempio i punteggio f {. quando si imposta un nuovo valore per una variabile o passare un argomento di una funzione. Swi tches supportare qualsiasi tipo di dati e di una vasta gamma di figlio compari operazioni che non sono l imi ta di numeri interi e test per la parità i ty. Write un punto interrogativo (?) Dopo il tipo di un valore di contrassegnare il valore come optional. Bretelle in tutto il corpo sono requi rosso. il valore opzionale è da scartare e assegnato alla costante dopo l et. è possibile write un array vuoto come [] e un vuoto di ctionary come [:] . Questi valori sono rappresentati come s opzionale. "Kayl ee": "c meccanicamente".per esempio.

" EXPERIMENT T ry removi ng caso defaul t. per fare una serie di indici o wri ting un expl i ci t ini ziale i zione. "atercress w": l et Vegetale Ecomment = "T hat w oul d fare un buon tè sandw i ch. 8]. 1. L et i nteresti ngNumbers = [ "Pri me": [2. 4. 3. "Square": [1. le EXI programma ts dal dichiarazione SWI tch. come w el l come w cappello che l argest numero w come. hasSuffi x ("pepe"): l et Vegetale Ecomment = "Sono io t una spi cy \ (x)?" defaul t: Vegetale Ecomment = "everythi ng buon sapore di minestra. 5. Esecuzione non continua al prossimo caso. 9. 16. Utilizzare w hi Le ripetere un blocco di codice unti cambiamenti zione Condi la carte. 13]. 7.l et Vegetale e = "red pepper" sw i tch Vegetale e { caso "cel Ery": l et Vegetale Ecomment = "Aggiungere alcuni SI ns rai e fare formiche su al OG. Si utilizza per-i n a i terate oltre i sistemi in una di ctionary fornendo un pai r di nomi da utilizzare per ogni valore-chiave pai r. Questi due cicli fare lo stesso cosa: var fi rstForLoop = 0 per i i n 0. invece. 3 { fi rstForLoop + = i . . Condi zione. e l'incremento." caso l et x w qui x. var n = 2 w hi l e n <100 { n=n*2 } n var m = 2 do { m=m*2 i l e m <100 È possibile mantenere un indice in un ciclo-ei ther utilizzando. 2." caso "cetriolo". "Fi Bonacci": [1. quindi non c'è bisogno di expl i CI temente spezzare il tch SWI alla fine del codice di ogni singolo caso. assicurando che il ciclo viene eseguito almeno una volta. ] var l argest = 0 per (ki nd. numeri) i N i nteresti ngNumbers { per numero i n numeri { i numero f> l argest { l argest = numero } st EXPERIMENT Aggiungi un altro Vari abl e per tenere traccia di w hi ch ki nd di numero w come l argest. Che errore si ottiene? Dopo l'esecuzione del codice all'interno del caso SWI tch che ha trovato. 11. 5. 25]. La condi zione di un ciclo può essere alla fine. 3.

col loro nando in un array.. func returnFi quindici () -> Int { var y = 10 func add () { y+=5 } add () ritorno y } returnFi quindici () Le funzioni sono un tipo primo-classe. 3 79) } ces getGasPri () Le funzioni possono al modo da prendere un numero variabile di argomenti. oggi i s \ (giorno)." } salutare ("Bob". . . . ++ i { secondForLoop + = 1 ndForLoop Usa. È possibile utilizzare le funzioni nidificate per orga ZE il codice in una funzione che è lungo o complesso. ces getGasPri func () -> (e Doubl. e l'uso. 12) EXPERIMENT Write un functi su quella Ates cal cul la media di i ts argomenti. per fare una gamma che OMI ts i ts valore superiore. Funzioni nidificate hanno accesso alle variabili che sono state dichiarate in la funzione esterna.} fi rstForLoop var secondForLoop = 0 per var i = 0. Usare una tupla per restituire i valori teplici mul da una funzione. double. Cal la funzione suc cessivo i ts nome wi th ali st di argomenti tra parentesi. Int) -> Int { var sum = 0 per numero i n numeri { sum + = numero } somma di ritorno } sumOf () sumOf (42. i <3. giorno: Stri ng) -> Stri ng { ritorno "Hel l o \ (nome). Thi s significa che una funzione può restituire un'altra . "T uesday") EXPERIMENT Rimuovere il parametro giorno. func salutare (nome: Stri ng. double) { ritorno (3 59. Funzioni e chiusure Utilizzare func per dichiarare una funzione. Le funzioni possono essere nidificate. 597. func sumOf (i numeri:. 3 69. per fare un intervallo che include entrambi i valori.. Aggiungere un parametro per i L unch al speci ncl ude di oggi nella greeti ng. Usa -> per separare i nomi dei parametri e tipi dal tipo di ritorno della funzione.

Utilizzare i n per separare gli argomenti e il tipo di ritorno dal corpo. Sono disponibili diverse opzioni per wri ting periodi di chiusura più conci Sely. come la lback cal per un delegato. Potete write una chiusura wi sarie.map ({numero i n numero 3 *}) È possibile fare riferimento ai parametri da numero invece di approccio nome-thi s è ly especial utile molto brevi chiusure. dichiarazioni di metodo e funzione sono WRI tten allo stesso modo. o entrambi. è possibile omi t il tipo di i ts parametri. 12. 19. func makeIncrementer () -> (Int -> int) { func Addone (numero: Int) -> Int { ritorno 1 + numero } ritorno Addone } var i = ncrement makeIncrementer () i ncrement (7) Una funzione può assumere un'altra funzione come uno di i ts argomenti. Condi ti on: Int -> Bool) -> Bool { per i tem i n l i st { I f Condi ti su (i TEM) { return true } } ritorno fal se } func l ESST hant en (numero: Int) -> Bool { numero eturn <10 Numeri = [20.map ({ (numero: Int) -> Int i n l et Resul t = 3 * numero ritorno Resul t }) EXPERIMENT Rew ri te la osure cl per tornare al zero per l numeri dispari. 7. numbers. Una chiusura passato come ultimo argomento a una funzione può appaiono subito dopo le parentesi. sort ([1. senza un nome circondando codice wi th parentesi graffe ({}). i tS restituiscono tipo. 12] nyMatches (numeri. 2]) {$ 0> $ 1} Oggetti e classi Utilizzare cl fol culo lowed per nome della classe per creare una classe. Quando il tipo di chiusura i s al pronto conosciuta. numbers. hasAnyMatches func (li st: int []. .funzione come I Sigla di valore. Una dichiarazione di proprietà in una classe i s wri tten stesso modo come dichiarazione costante o variabile. Chiusure singola istruzione IMPL i CI temente restituiscono il valore di thei r unica dichiarazione. l ESST hant it) Le funzioni sono effettiva mente un caso speciale di chiusure. 3. Likewi se. 5. tranne che itis nella contesto di una classe.

in modo da poter includere o omi t una superclasse. Piazza cl ass: NamedShape { var SI deLength: double i ni t (si deLength: double. WI Thout overri de. separati da due punti. SI mpl eDescri PTI su () Versione Thi s della classe Shape è mi ssing qualcosa di importante: un ini ziale i Zer per impostare il classe quando un'istanza I S creato. La COMPI ler al modo di rilevare metodi wi th overri de che non mente effettiva priorità su qualsiasi metodo nella superclasse." . cl ass NamedShape { var numberOfSi des: int = 0 var name: String ng i ni t (name: String ng) { sel f. Le sottoclassi includono thei r nome superclasse dopo thei nome della classe r.cl ass Shape { var numberOfSi des = 0 func sc mpl eDescri PTI su () -> Stri ng { ritorno "Una forma wi th \ (numberOfSi des) SI des". Non c'è rement requi per le classi di sottoclasse qualsiasi classe radice di serie. viene rilevata dal ler COMPI come errore. Metodi di una sottoclasse che sostituiscono l'attuazione della superclasse sono contrassegnati wi th overri de-override di un metodo per caso. Ce Noti come FIS sel usati per stingui di sh la proprietà nome dalla tesi nome al ini ziale i Zer. Utilizzo init per creare uno. Utilizzare dei ni t per creare un ziale deini i Zer se è necessario eseguire alcune di pulizia prima che l'oggetto è affare trova. sc deLength = SI deLength eccellente. Utilizzare la sintassi del punto per accedere alle proprietà e ai metodi dell'istanza. nome: Stri ng) { sel f. Ogni proprietà ha bisogno di un valore assegnato-ei ther in i ts dichiarazione (come wi th numberOfSi des) o nella ini ziale i zer (come wi th nome). forma var = Shape () forma. e aggiungere un altro metodo che prende un argomento. se necessario. Creare un'istanza di una classe mettendo tra parentesi dopo il nome della classe. name = Nome } func sc mpl eDescri PTI su () -> Stri ng { ritorno "Una forma wi th \ (numberOfSi des) SI des". Gli argomenti del ini ziale i zer sono passati l ike un l funzione cal quando si crea un'istanza della classe. } } EXPERIMENT Aggiungi un costante wi proprietà th l et. init (nome: nome) numberOfSi des = 4 } zona unc () -> double { ritorno SI deLength * SI deLength Verri de func SI MPL eDescri PTI su () -> Stri ng { ritorno "Una piazza wi th SI des di l length \ (si deLength). numberOfSi des = 7 var shapeDescri PTI su = forma.

ma sti ll bisogno di fornire il codice che viene eseguito prima e dopo aver impostato un nuovo valore. ass cl Equi l ateral T ri angl e: NamedShape { var SI deLength: double = 0 0 i ni t (si deLength: double. 2. SI deLength } } var piazza: Piazza { w i l l Set { tri angl e. SI deLength (si ze: double. cl ass T ri angl eAndSquare { var tri Angl e: Equi l ateral T ri angl e { w i l l Set { quadrato. il nuovo valore ha la impl i CI t nomino nuova Val ue. Ce Noti che l'ini ziale i Zer per il Equi l ateral T ri angl e classe ha tre fasi di fferent: 1 Impostare il valore della proprietà che la sottoclasse dichiara. deLength sc = new Val ue. nome: nome) . init (nome: nome) numberOfSi des = 3 } ar metro peri: double { et { ritorno 3 0 * SI deLength et { deLength sc = new Val UE / 3 0 Verri de func SI MPL eDescri PTI su () -> Stri ng { return "un equi l ateral tri agl EWI ° sc des di l length \ (si deLength). peri metro gl e. utilizzo sarà Impostare e di DImpostare. nome: "un tri angl e") gl e. Impl ement un'area e una descri essere metodo sul Ci RCL e cl ass.est = quadrato (si deLength: 5 2. nome: Stri ng) { square = quadrato (si deLength: si ze. sc deLength = SI deLength eccellente. peri metro = 9 9 gl e. getter o setter può al così essere fatto a punto thi s. Se non è necessario calcolare la proprietà. In ne addi a proprietà semplici che vengono memorizzati." ri angl e = Equi l ateral T ri angl e (si deLength: 3 1. SI deLength Nel setter per metro peri. Qualsiasi impostazione zionale addi lavoro che utilizza i metodi. nome: Stri ng) { sel f. nome: "la mia square test") zona () SI mpl eDescri PTI su () EXPERIMENT Fare un altro subcl culo di NamedShape cal l ndr Ci RCL e che prende una Radi noi e un nome come argomenti per i ts i ni Ti Al i Zer. la classe inferiore garantisce che la lunghezza del lato di i ts triangolo è sempre uguale alla lunghezza del lato di i ts quadrato. Ad esempio. nome: nome) tri angl e = Equi l ateral T ri angl e (si deLength: si ze. Cal l ing ini ziale della superclasse i Zer. È possibile fornire un expl i CI t nomino tra parentesi dopo set. le proprietà possono avere un getter e setter. deLength sc = new Val ue. 3 Cambiare il valore delle proprietà definite dalla superclasse.

l' valore dell'intera espressione è un valore facoltativo. Fi ve. Otherwi se. un metodo ha lo stesso nome per i ts parametri quando si cal illuminato e wi sottile il metodo che ho TSEL f. Ki ng func sc mpl eDescri PTI su () -> Stri ng { sw i tch sel f { caso. numberOfT i MES: 7) Quando si lavora wi th valori opzionali. ch whi viene utilizzato all'interno del metodo. Come classi e AL L altri tipi di nome. In entrambi i casi. puoi speci fy un secondo nome. toRaw () EXPERIMENT Write un functi su che confronta avvenga due ues Classifica val da compari ng thei r UES val prime. nome: "l Arger quadrato") gl eAndSquare. l et opti onale Square: Square? = Quadrato (si deLength: 2 5. Per defaul t.Queen: ritorno "regina" caso. toRaw ()) } ce = Rank. T en caso Jack. T hree. Contatore ass cl { var count: int = 0 func i ncrementBy (importo: Int. nome: "Piazza onale Opti") l et sc deLength = opti onal Piazza ?. SI deLength Enumerazioni e Strutture Utilizzare enum per creare una enumerazione. Classifica enum: Int { caso Asso = 1 caso T wo. ma i parametri i nomi dei metodi sono al modo utilizzato quando si cal l il metodo (tranne che per il primo parametro fi). SI deLength gl eAndSquare. . nome: "un'altra forma di prova") gl eAndSquare. i ncrementBy (2. Sette. Se il valore della prima? i s ni l. quadrato. Ei ght. Ace: ritorno "asso" caso. è possibile WRI te? Prima metodi IKE operazioni l. Jack: ritorno "jack" caso . tutto dopo l'? i s ignorato e il valore dell'intera espressione è ni l. numberOfT i mes ti mes: int) { contare + = importo * TI mes } } contatore var = Contatore () contatore. square = quadrato (si deLength: 50. asso ceRaw Val ue = asso. Regina. Ni NE.ri angl eAndSquare = T ri angl eAndSquare (si ze: 10. proprietà e indicizzazione. Ki ng: ritorno "ki ng" defaul t: ritorno Stri ng (sel f. I nomi dei parametri in funzioni vengono utilizzate solo wi sottile la funzione. tri angl e. il valore opzionale i s scartare. tri angl e. e tutto dopo l'? agisce sul valore scartare. SI deLength gl eAndSquare. Si x. enumerazioni può avere metodi associati wi th loro. SI deLength Metodi di classi hanno un importante di fference dalle funzioni. quattro.

Infatti. in modo da avere solo speci fy il primo valore grezzo. nei casi in cui i sn't un valore grezzo significativo. ma le classi sono passati per riferimento. Cuori i s di cui da i ts ful l nome. SI mpl eDescri PTI su () EXPERIMENT Aggiungere un colle o metodo per Sui t che restituisce "ack bl" per vanghe e cl ubs. perché la costante non ha un expl i CI T tipo speci cato. come il tipo grezzo di una enumerazione. Spades: ritorno "picche" caso. Si può così al utilizzare stringhe o numeri in virgola mobile. Cuori perché il valore di sel fis al pronto noto per essere una sui t. Hearts: ritorno "cuori" caso .DI amonds: ritorno "di amonds" caso. Noti Ce i due modi in cui il membro Cuori dell'enumerazione è di cui sopra: Quando si assegna un valore a cuore costante. Cl ubs: ritorno "cl ubs" } earts = Sui t. Utilizzare struct per creare una struttura. All'interno del tch SWI. l'enumerazione viene definita dalla forma abbreviata. e restituisce "rosso" per il cuore e di amonds. compresi i metodi e le ini Zers i ziali. non lo fai di prevedere uno. struct Card { var rank: Classifica var sui t: Sui t func sc mpl eDescri PTI su () -> Stri ng { . Hearts. i f l et convertedRank = Rank. Strutture di sostegno molti degli stessi comportamenti come classi. Cuori PTI eartsDescri su = cuori. Di amonds. il tipo RAW valore dell'enumerazione è int. È possibile utilizzare il modulo in qualsiasi momento abbreviata del valore del tipo i s al pronto conosciuta. Il resto dei valori grezzi vengono assegnati in ordine. non solo un altro modo di WRI Ting thei r valori grezzi. SI mpl eDescri PTI su () } I valori dei membri di un'enumerazione sono valori reali. Uno dei più importanti fferences Di tra strutture e classi è che le strutture siano sempre copiati quando sono passati in giro nel codice.Nell'esempio precedente. il Sui t membro di enumerazione. Utilizzare le funzioni toRaw e fromRaw per la conversione tra il valore grezzo e l'enumerazione valore. Cl ubs func sc mpl eDescri PTI su () -> Stri ng { sw i tch sel f { caso. enum Sui t { caso Spades. fromRaw (3) { l et threeDescri PTI su = convertedRank.