2015-01-13 30 views
5

Come è possibile impostare la funzione di un protocollo in modo che possa ricevere un argomento facoltativo o addirittura ignorarlo?Argomento predefinito rapido e argomento ignora nel metodo/funzione protocollo

ho questo protocollo:

protocol Game { 
    func modeName(forRound: Int) -> ModeName 
} 

Con questi 2 speciali classi:

//Goal: Default forRound should be 0 if none provided 
class OnlineGame : Game { 
    func modeName(forRound: Int = 0) -> ModeName { 
     //Some code 
    } 
} 

//Goal: I don't care about the forRound value here 
class OfflineGame : Game { 
    func modeName(_ forRound: Int) -> ModeName { 
     //Some code 
    } 
} 

risposta

0

Prima di tutto, nel , si dichiara "metodo", e the first parameter of "method" has no external name by default. Così qui è la vera normale codice caso:

class SomeGame: Game { 
    func modeName(forRound: Int) -> ModeName { 
     // ... 
    } 
} 

let game: Game = SomeGame() 
let modeName = game.modeName(1) // not `game.modeName(forRound: 1)` 

Nel vostro caso OnlineGame, if the parameter has default value, it has external name automatically anche se è il primo parametro del metodo. È possibile ignorare che il comportamento con _ come esplicito nome esterno:

class OnlineGame : Game { 
    func modeName(_ forRound: Int = 0) -> ModeName { 
     //Some code 
    } 
} 

Nel vostro OfflineGame caso, è possibile ignorare il parametro con _ come nome interno:

class OfflineGame : Game { 
    func modeName(_: Int) -> ModeName { 
     //Some code 
    } 
} 
+0

Grazie per la risposta. Ho ancora un problema con 'OnlineGame', non posso chiamare' game.modeName() 'senza un parametro se imposto la funzione come hai scritto nella classe OnlineGame:' ​​func modeName (_ forRound: Int = 0) -> ModeName' – Kalzem

+0

Nice. Questo ha funzionato per me. Al mio primo tentativo, qualche tempo fa, ovviamente ho fatto qualche errore. Grazie! –

+0

@BabyAzerty Come si dichiara la variabile 'game'? Se questo è 'let game: Game = OnlineGame()', non puoi chiamare direttamente '.modeName()', perché il compilatore non sa che è un'istanza della classe 'OnlineGame'. – rintaro

Problemi correlati