Casting Swift

di il
9 risposte

Casting Swift

Buongiorno,
mi piacerebbe sapere se sono effettivamente presenti o meno alcuni errori di battitura nel testo di Matt Neuburg "Swift per iOS8" : ho notato che a partire da pagina 170 con queste righe di codice :

func Telltohush (d: Dog) {
(d as! Noisydog).bequiet()
}
let d : Noisydog = NoisyDog()
telltohush(d)

si passa alla funzione "telltoHush" solamente l'argomento d , il che mi da' un errore in compilazione di questo tipo : "missing argument label 'd:' in call
telltohush(d)" quindi ho pensato che si dovesse mettere telltohush(d:d), a questo punto la compilazione parte e funziona correttamente, mi sbaglio sulla correzione da me effettuata?
Ringrazio in anticipo

9 Risposte

  • Re: Casting Swift

    Ciao, al 99% non si tratta di un errore, ma avete ragione entrambi
    Swift, infatti, è un linguaggio molto giovane e questo lo porta ad evolversi molto velocemente, passando da Swift 1 a metà 2014 per arrivare all'attuale Swift 3. Purtroppo durante questo processo sono cambiate tantissime cose, alcune delle quali non sono più retro-compatibili.

    Di conseguenza, è probabile che il libro si riferisse ad una delle primissime versioni, in cui la label del primo parametro di una funzione non era richiesta, mentre tu sviluppi con una delle ultime versioni, in cui le label di tutti i parametri sono richieste (qua trovi la proposta fatta da un utente per implementare questa modifica).

    Un consiglio che ti do è quello di scaricare l'ebook gratuito che trovi a questo link (oppure sull'iTunes Store, tramite il quale puoi ottenere automaticamente i vari aggiornamenti futuri del libro), in modo da essere aggiornato con le funzionalità disponibili nell'ultima versione del linguaggio.
  • Re: Casting Swift

    Ti ringrazio molto per la risposta esaustiva, quindi ho capito che nelle precedenti versioni di Swift non era necessario mettere il nome del primo parametro seguito dalla variabile effettiva .
    Non capisco un'ulteriore cosa però riguardo questo codice, nella dichiarazione della funzione telltohush si mette come parametro "d" che deve essere di tipo Dog, non capisco che cosa significhi letteralmente questa affermazione.
    E poi come seconda domanda che differenza intercorre tra dichiarare una let in questo modo let d : Noisydog = Noisydog() e dichiararla come let d = Noisydog(), non sono la stessa cosa?
  • Re: Casting Swift

    Parto rispondendoti dalla seconda domanda, che ha una risposta più immediata.
    Nei linguaggi di programmazione fortemente tipizzati (come Swift appunto, ma anche Java, C e tanti altri) quando dichiari una variabile devi sempre specificare di che tipo è. In Swift questa cosa può talvolta essere omessa in quanto il compilatore riesce a "capire" di che tipo è una variabile in base a ciò che le viene assegnato (caratteristica detta "type inference").

    Per farti un esempio:
    
    let x = 5
    
    In questa istruzione non è esplicitato il tipo della variabile, ma poiché alla variabile assegniamo un numero intero, allora Swift dedurrà che la variabile x è di tipo Int. Di conseguenza, quell'istruzione è esattamente identica a:
    
    let x: Int = 5
    
    Nota che le variabili possono essere solamente di un tipo, per cui se provi ad assegnare ad x un valore non intero, ad esempio una stringa, ti scatterà un errore in compilazione.

    Per la prima domanda, invece, cosa non ti è chiaro nello specifico? Il fatto che il parametro si chiami "d" (puoi chiamarlo come ti pare, se "d" non ti piace)? Il fatto che devi esplicitare il tipo "Dog" (essendo Swift fortemente tipizzato, ogni volta che definisci una nuova variabile devi anche specificarne il tipo, salvo i casi in cui interviene la type inference di cui sopra)?
  • Re: Casting Swift

    Grazie mille ancora!
    Per quanto riguarda la prima domanda , in una parte di codice antecedente si dichiarava una classe Dog con relativi metodi e una sottoclasse di quest'ultima con altri metodi differenti (tra cui telltohush) per questo abbiamo dovuto utilizzare il casting, a questo punto non riesco a capacitarmi che ad una funzione possa essere passata un'istanza di una classe , o meglio che cosa è che propriamente viene passato al compilatore? Questo dubbio nasce perchè sono abituato al fatto che ad una funzione solitamente passo degli argomenti a dei parametri, che sono variabili e che quindi assumono un valore mentre in questo caso non riesco a capire che cosa letteralmente viene passato.
    Mi scuso per la domanda forse un po' contorta.
    Ad ogni modo grazie ancora!
  • Re: Casting Swift

    In realtà non c'è nulla di strano, è perfettamente legale (ed utile) passare istanze di classi (cioè oggetti) alle funzioni.
    All'interno della funzione "telltohush", ad esempio, viene richiamata sull'oggetto passato come parametro una funzione che probabilmente modificherà qualche proprietà del parametro stesso in modo da "zittirlo", visto che a giudicare dal nome è quello lo scopo della funzione.

    Se ci pensi, comunque, ogni volta che usi la funzione "print" per stampare qualcosa, le stai passando una stringa, ovvero un oggetto (a dir la verità le stringhe non sono proprio oggetti ma qualcosa di leggermente diverso, ma dal punto di vista del tuo dubbio ciò non fa differenza)
  • Re: Casting Swift

    Ora capisco meglio!; giusto per curiosità che cosa rappresentano le stringhe se non sono oggetti?
    Grazie ancora
  • Re: Casting Swift

    Le stringhe, così come tanti "tipi primitivi" (es: Int, Bool, ecc.) sono Struct, che per certi versi sono molto simili agli oggetti, ma una grande differenza è che vengono passati per copia, mentre gli oggetti per riferimento.
  • Re: Casting Swift

    Ti ringrazio molto!
  • Re: Casting Swift

    .
Devi accedere o registrarti per scrivere nel forum
9 risposte