2015-01-13 15 views
5

プロトコルの機能を設定して、オプションの引数を受け取ったり、無視することができますか?あなたは "メソッド" を宣言している、に、すべてのプロトコルメソッド/ファンクションのデフォルト引数と無視引数を短くする

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

答えて

0

まず、およびthe first parameter of "method" has no external name by default:これら2つの特別クラスと

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

私は、このプロトコルを持っています。それはメソッドの最初のパラメータだ場合でも、あなたのOnlineGame場合

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

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

if the parameter has default value, it has external name automatically:だからここに非常に通常ケースコードです。あなたが_として明示外部名とその動作をオーバーライドすることができます:あなたの答えのための

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

ありがとう:あなたのOfflineGame場合

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

、あなたは_内部名ようにパラメータを無視することができます。私はOnlineGameクラスで書いたように関数を設定しても、 'OnlineGame'にはまだ問題がありますが、パラメータなしで' game.modeName() 'を呼び出すことはできません:' func modeName(_ forRound:Int = 0) ModeName' – Kalzem

+0

ニース。これは私のために働いた。私の最初の試みでは、私は明らかに何らかの過ちを犯しました。ありがとう! –

+0

@BabyAzerty 'game'変数はどのように宣言しますか? 'let game:Game = OnlineGame()'であれば、 'OnlineGame'クラスのインスタンスであることをコンパイラが知らないので、' .modeName() 'を直接呼び出すことはできません。 – rintaro

関連する問題