2015-01-13 6 views
5

Wie kann ich ein Protokoll der Funktion gesetzt, so dass es ein optionales Argument erhalten oder sogar ignorieren?Swift Standardargument und ignorieren Argument in Protokollmethode/Funktion

Ich habe dieses Protokoll:

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

Mit diesen 2 Sonder Klassen:

//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 
    } 
} 

Antwort

0

Vor allem in den erklären Sie "Methode" und the first parameter of "method" has no external name by default. Also hier ist der sehr normale Fall Code:

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

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

In Ihrem OnlineGame Fall if the parameter has default value, it has external name automatically auch wenn es der erste Parameter des Verfahrens ist. Sie können dieses Verhalten mit _ als explizite externen Namen außer Kraft setzen:

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

Vielen Dank für Ihre Antwort:

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

In Ihrem OfflineGame Fall können Sie den Parameter mit _ als internen Namen ignorieren. Ich habe immer noch ein Problem mit 'OnlineGame', ich kann' game.modeName() 'nicht ohne Parameter aufrufen, wenn ich die Funktion so einstelle, wie Sie in der OnlineGame-Klasse geschrieben haben:' func modeName (_ forRound: Int = 0) -> ModeName' – Kalzem

+0

Schön. Das hat für mich funktioniert. Bei meinem ersten Versuch vor einiger Zeit habe ich offensichtlich einen Fehler gemacht. Vielen Dank! –

+0

@BabyAzerty Wie deklariert man 'Spiel' Variable? Wenn das "let game: Game = OnlineGame()" ist, kann man '.modeName()' nicht direkt aufrufen, weil der Compiler nicht weiß, dass es sich um eine Instanz der 'OnlineGame' Klasse handelt. – rintaro

Verwandte Themen